Unity引擎2D游戏开发,切换场景与人物可互动标识总结
切换场景
可以通过新建一个持久化地场景,将所有常驻元素放置进此场景里面,然后再将进入的场景加载(Loud)在Hierarchy窗口中。如果切换了其他某一个场景,再将离开的场景停用(Unload),进入的场景加载(Loud),即可实现。
创建持久化场景,移入Hierarchy
将所有永恒不变,常驻的元素移入此创建的持久化场景中
其他的场景如果要加载则load
,如果不加载则unload
注意一个场景是否被激活(Active)。当切换场景的时候,需要改变激活的场景。右击场景,有一个
Set Active Scene
,这也是在切换场景脚本内需要注意调用的函数。当前项目内,Persistent场景是不需要被激活的,因为它的作用就是持久化常驻元素。
物品互动
创建必须的物体
创建一个宝箱,将其拖入到场景中
给宝箱加上Box Collider 2D
,加上碰撞范围,因为需要知道人物是否已经走到了宝箱的范围之内
勾选上Is Trigger
,因为不希望将人物弹开,对人物有影响
对于按键互动,还需要创建一个按键提示的标识与按键动画,因此添加进按键的素材
如果对其创建动画,则对按键绑定Animator,新建Animatior Controller后,设置进该组件的Controller中
然后再创建对应的动画
对按键提示绑定Box Collider 2D,当Button的Collider碰撞到宝箱等可互动物体时,展示按键提示
将诸如此类的可互动物体,都标记为可互动的标签
在代码中,判断绑定的碰撞体的标签是否为Interactable,如果是的话,则展示按键动画
private void OnTriggerStay2D(Collider2D collision)
{
// 如果碰撞体标签为可互动的
if (collision.CompareTag("Interactable"))
{
// 是否展示按键动画
canPress = true;
}
}
private void Update()
{
if (canPress)
{
buttonSignSprite.SetActive(true);
}
}
解决按键提示会反转的问题
通过设置按键的Transform为玩家的Transform即可
buttonSignSprite.transform.localScale = playerTransform.localScale;
解决按键提示不会消失的问题
private void OnTriggerExit2D(Collider2D collision)
{
canPress = false;
}
不同的设备输入,实现不同的按键提示
在Animator中,新建一个空的State,并设置为默认State,以上创建的两个动画不进行任何链接。后续通过Animator播放指定名字,播放对应的动画
在Awake()方法中,创建PlayerInputControl对象,并启用
private PlayerInputControl playerInput;
private void Awake()
{
anim = buttonSignSprite.GetComponent<Animator>();
playerInput = new PlayerInputControl();
playerInput.Enable();
}
在Unity中,自带一个InputSystem的输入变化事件onActionChange,调用此事件并绑定一个方法
private void OnEnable()
{
InputSystem.onActionChange += OnActionChange;
}
private void OnActionChange(object obj, InputActionChange actionChange)
{
}
在InputActionChange对象内,有多种回调方法:
public enum InputActionChange { ActionEnabled, ActionDisabled, ActionMapEnabled, ActionMapDisabled, ActionStarted, ActionPerformed, ActionCanceled, BoundControlsAboutToChange, BoundControlsChanged, }
在OnActionChange()方法内,判断输入切换时,读取切换的设备名称,进行对应按键动画的播放
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.XInput;
private void OnActionChange(object obj, InputActionChange actionChange)
{
if (actionChange == InputActionChange.ActionStarted)
{
// Debug.Log(((InputAction)obj).activeControl.device);
var device = ((InputAction)obj).activeControl.device;
switch (device.device)
{
case Keyboard:
anim.Play("KeyboardInteract");
break;
case XInputController:
anim.Play("GamepadInteract");
break;
}
}
}
PS手柄:导入UnityEngine.InputSystem.DualShock;
NS手柄:导入UnityEngine.InputSystem.Switch;
解决按键动画刚开始不进行的问题
由于正常状态下,按键并没有启用,所以并没有获得到Animator的组件,只有碰撞到可互动物体时才启动按键对象
所以更换为停启用Sprite Renderer