首页 > 其他分享 >Unity引擎2D游戏开发,切换场景与人物可互动标识总结

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

时间:2024-02-20 22:55:54浏览次数:30  
标签:动画 场景 void private 2D 标识 Unity 按键 互动

切换场景

可以通过新建一个持久化地场景,将所有常驻元素放置进此场景里面,然后再将进入的场景加载(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;
        }
    }
}

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

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

所以更换为停启用Sprite Renderer

image

标签:动画,场景,void,private,2D,标识,Unity,按键,互动
From: https://www.cnblogs.com/xinlindeyu/p/18024225

相关文章

  • Unity中的SerializeReference使用简介
    Unity默认可以序列化值类型,Serializable属性修饰的类型,派生自UnityEngine.Object的类型,通常这些类型已经足以供日常使用了.但是有时我们希望在编辑器面板上序列化一个接口或者抽象类,则需要用到SerializeReference属性.假定我们有一个接口IEatable,并实现了两个类Brea......
  • 爬虫_02days
    免费代理池搭建#代理有免费和收费代理#代理有http代理和https代理#匿名度 -高匿:隐藏访问者ip-透明:服务端能拿到访问者ip-作为后端,如何拿到使用代理人的ip -请求头中:x-forword-for-如果一个HTTP请求到达服务器之前,经过了三个代理Proxy1、Proxy2、Proxy3......
  • Unity基于AssetBundle资源管理流程详解
    在Unity游戏开发中,资源管理是一个非常重要的环节。随着游戏的发展,资源会变得越来越庞大,因此需要一种高效的资源管理方式来减少内存占用和加快加载速度。AssetBundle是Unity提供的一种资源打包和加载方式,可以将资源打包成一个独立的文件,然后在运行时进行加载和卸载。本文将详细介绍......
  • Unity MVC开发模式与开发流程详解
    在Unity游戏开发中,采用MVC(Model-View-Controller)模式是一种非常常见的设计模式。MVC模式将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。这种模式可以有效地分离应用程序的逻辑和用户界面,使得代码更易于维护和扩展。本文将详细介绍Unity中的MVC开发模式及其开发流......
  • Unity引擎2D游戏开发,水和荆棘的逻辑实现
    Unity引擎2D游戏开发,水和荆棘的逻辑实现新建瓦片新建Water与Spike的Tilemap对新建的两个Tilemap绑定TilemapCollider2D,这样他们就会有碰撞判定,勾选上IsTrigger为了标识伤害的来源,将Water和Spike打上标签Tag添加好荆棘的瓦片,不要忘记选中Spike的图层进行添加添加好后,......
  • Unity简易事件系统
    事件系统是一个基于观察者模式之上构建的系统。通过利用delegate来进行Multicasting,实现一处激发则一触全发。​ 以下代码以简单的形式实现了一个仅限void类型函数的事件系统。publicclassEventManager:MonoSingleton<EventManager>{privatestaticDictionary<strin......
  • Unity常用设计模式之工厂模式
    工厂模式是一种常用的设计模式,它属于创建型模式,用于创建对象的过程中。在Unity中,工厂模式可以帮助我们更好地管理和创建对象,提高代码的可维护性和可扩展性。接下来,我将详细介绍Unity中常用的工厂模式。一、工厂模式概述工厂模式是一种创建型设计模式,它提供了一个统一的接口来创......
  • 关键字和标识符
    1.关键字是什么 不用刻意记,不小心用了会报错。 (报错图)2.标识符是什么 (依旧不用记忆,只要记住强制要求就行) ......
  • Unity UGUI的DrawCall优化
    UnityUGUI是一种强大的用户界面设计工具,它可以帮助开发者快速创建各种界面元素,从按钮和文本到滑块和面板等。然而,在使用UGUI时,一个常见的性能瓶颈就是DrawCall过多导致的性能下降。在本文中,我们将深入探讨UGUI的DrawCall优化方法,并给出对应的代码实现。什么是DrawCall?在Unity......
  • Unity红点系统的架构与设计
    在游戏开发中,红点系统是一种常见的功能,用于提示玩家有未读消息或待处理任务。在Unity引擎中,我们可以使用脚本来实现红点系统,下面我将介绍一种基于Unity的红点系统的架构与设计,并给出对应的代码实现。红点系统的代码实现首先,我们需要创建一个红点管理器的脚本RedDotManager.cs,......