Unity引擎2D游戏开发,切换场景与人物可互动标识总结

切换场景

可以通过新建一个持久化地场景,将所有常驻元素放置进此场景里面,然后再将进入的场景加载(Loud)在Hierarchy窗口中。如果切换了其他某一个场景,再将离开的场景停用(Unload),进入的场景加载(Loud),即可实现。

创建持久化场景,移入Hierarchy

image

将所有永恒不变,常驻的元素移入此创建的持久化场景中

image

其他的场景如果要加载则load,如果不加载则unload

image

注意一个场景是否被激活(Active)。当切换场景的时候,需要改变激活的场景。右击场景,有一个Set Active Scene,这也是在切换场景脚本内需要注意调用的函数。当前项目内,Persistent场景是不需要被激活的,因为它的作用就是持久化常驻元素

物品互动

创建必须的物体

创建一个宝箱,将其拖入到场景中

image

给宝箱加上Box Collider 2D,加上碰撞范围,因为需要知道人物是否已经走到了宝箱的范围之内

image

勾选上Is Trigger,因为不希望将人物弹开,对人物有影响

image

对于按键互动,还需要创建一个按键提示的标识与按键动画,因此添加进按键的素材

image

如果对其创建动画,则对按键绑定Animator,新建Animatior Controller后,设置进该组件的Controller中

image

然后再创建对应的动画

image

对按键提示绑定Box Collider 2D,当Button的Collider碰撞到宝箱等可互动物体时,展示按键提示

image

将诸如此类的可互动物体,都标记为可互动的标签

image

在代码中,判断绑定的碰撞体的标签是否为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播放指定名字,播放对应的动画

image

在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

image

posted @ 2024-02-20 22:53  心霖の雨  阅读(182)  评论(0编辑  收藏  举报