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,如果是的话,则展示按键动画

c# 复制代码
private void OnTriggerStay2D(Collider2D collision)
{
    // 如果碰撞体标签为可互动的
    if (collision.CompareTag("Interactable"))
    {
        // 是否展示按键动画
        canPress = true;
    }
}

private void Update()
{
    if (canPress)
    {
        buttonSignSprite.SetActive(true);
    }
}

解决按键提示会反转的问题

通过设置按键的Transform为玩家的Transform即可

c# 复制代码
buttonSignSprite.transform.localScale = playerTransform.localScale;

解决按键提示不会消失的问题

c# 复制代码
private void OnTriggerExit2D(Collider2D collision)
{
    canPress = false;
}

不同的设备输入,实现不同的按键提示

在Animator中,新建一个空的State,并设置为默认State,以上创建的两个动画不进行任何链接。后续通过Animator播放指定名字,播放对应的动画

在Awake()方法中,创建PlayerInputControl对象,并启用

c# 复制代码
private PlayerInputControl playerInput;

private void Awake()
{
    anim = buttonSignSprite.GetComponent<Animator>();

    playerInput = new PlayerInputControl();
    playerInput.Enable();
}

在Unity中,自带一个InputSystem的输入变化事件onActionChange,调用此事件并绑定一个方法

c# 复制代码
private void OnEnable()
{
    InputSystem.onActionChange += OnActionChange;
}

private void OnActionChange(object obj, InputActionChange actionChange)
{

}

在InputActionChange对象内,有多种回调方法:

markdown 复制代码
public enum InputActionChange
{
    ActionEnabled,

    ActionDisabled,

    ActionMapEnabled,

    ActionMapDisabled,

    ActionStarted,

    ActionPerformed,

    ActionCanceled,

    BoundControlsAboutToChange,

    BoundControlsChanged,
}

在OnActionChange()方法内,判断输入切换时,读取切换的设备名称,进行对应按键动画的播放

c# 复制代码
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;
        }
    }
}

解决按键动画刚开始不进行的问题

由于正常状态下,按键并没有启用,所以并没有获得到Animator的组件,只有碰撞到可互动物体时才启动按键对象

所以更换为停启用Sprite Renderer

相关推荐
北桥苏13 小时前
如何在 Unity3D 中实现圆角效果?
unity3d·游戏开发
UWA1 天前
Gears实测室:第一期·音游跨设备性能表现与工具价值实践
信息可视化·性能优化·游戏开发·uwa
红红大虾2 天前
Defold核心概念之Message Passing
游戏开发
红红大虾2 天前
Defold核心概念之Building Blocks
游戏开发
Mr_1478 天前
【独游开发必备】游戏开发资源宝藏网站(美术篇)
游戏开发
Aoife婳9 天前
【Bug】UE5中纹理和地形一直闪烁
游戏开发
龚子亦9 天前
【Unity开发】丧尸围城项目实现总结
unity·游戏引擎·游戏开发
小哈里12 天前
【Game-Infra】游戏开发的流程,游戏发布的打包与构建(硬件选型,SDK与操作系统,包体管理,弹性构建,构建调优)
游戏·游戏开发·后端开发·基础设施·打包构建·游戏发布·弹性构建
小强Fnsy13 天前
一款将GIF、序列帧的指定选区转换成新的序列帧,并导出为Plist、PNG、GIF的工具
前端·游戏开发
泉城老铁14 天前
VUE2实现加载Unity3d
前端·vue.js·unity3d