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

相关推荐
ryfdizuo4 天前
HDR渲染管线中的像素格式-v1
图形渲染·渲染·游戏开发·hdr·色彩·高动态
2401_841495644 天前
【游戏开发】登山赛车
数据结构·python·游戏·游戏开发·pygame·登山赛车游戏·游戏打包发布
喵个咪5 天前
Go单协程事件调度器:游戏后端的无锁有序与响应时间掌控
后端·游戏开发
yongche_shi6 天前
第九十九篇:Python在其他领域的应用:游戏开发、物联网、AIoT简介
开发语言·python·物联网·游戏开发·aiot
SmalBox6 天前
【节点】[NormalBlend节点]原理解析与实际应用
unity3d·游戏开发·图形学
龙智DevSecOps解决方案6 天前
Perforce《2025游戏技术现状报告》Part 5:创意工作者在用什么工具以及如何看待游戏引擎与生成式AI(附免费下载)
游戏引擎·游戏开发·软件开发·perforce·ai创作·龙智
_大学牲6 天前
Flutter 勇闯2D像素游戏之路(五):像元气骑士一样的设计随机地牢
flutter·游戏·游戏开发
SmalBox7 天前
【节点】[ColorMask节点]原理解析与实际应用
unity3d·游戏开发·图形学
SmalBox7 天前
【节点】[ChannelMask节点]原理解析与实际应用
unity3d·游戏开发·图形学
UWA8 天前
GPM 2.0全新功能发布|GPU精准监测 + 精细化运营,重构游戏性能管控新范式
人工智能·游戏·性能优化·重构·游戏开发·uwa