首页 > 其他分享 >7-1. 人物可互动标识

7-1. 人物可互动标识

时间:2024-02-28 12:00:39浏览次数:27  
标签:场景 人物 void private Sign 标识 anim using 互动

场景中叠加场景

将两个场景的公用部分提取到 Persistent 场景中,之后需要使用哪个场景,只需要把那个场景添加到 Persistent 场景下面就行了

注意,如果要往场景中添加物体的话,需要先把场景激活

添加宝箱

先切割宝箱图片,然后把宝箱放到场景中,给宝箱添加 Box Collider 2D,设置碰撞体为 Trigger,并修改碰撞体大小

人物头顶可互动标识

将 GameButtons 图片按 16 x 16 的大小进行切割

切割好的图片放到人物头顶,接着创建动画状态机,起名叫 Sign

将上面四张图片做成一个动画,起名叫 keyboard

再将上面四张图片做成一个动画,起名叫 xbox(因为我只有 xbox 手柄)

最终的动画状态机如下所示

互动实现

把刚才创建的 Sign 改名为 Sign Sprite,并且给它添加一个父节点 Sign,给这个父节点添加 Box Collider 2D

创建一个叫 Sign 的脚本,并挂载到 Sign 对象下面,最终 Sign 的代码如下所示

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.XInput;

public class Sign : MonoBehaviour
{
    private PlayerInputControl playerInput;
    private Animator anim;
    public GameObject signSprite;
    public Transform playerTrans;
    private bool canPress;

    private void Awake()
    {
        // 因为一开始子物体是关闭的,所以不能使用 GetComponentInChildren
        // anim = GetComponentInChildren<Animator>();
        anim = signSprite.GetComponent<Animator>();

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

    private void OnEnable()
    {
        // 输入设备发生改变的事件
        InputSystem.onActionChange += OnActionChange;
    }

    private void Update()
    {
        // signSprite.SetActive(canPress);
        signSprite.GetComponent<SpriteRenderer>().enabled = canPress;
        signSprite.transform.localScale = playerTrans.localScale;
    }

    private void OnActionChange(object obj, InputActionChange actionChange)
    {
        if (actionChange == InputActionChange.ActionStarted)
        {
            // 说明有新设备按下了按键
            // Debug.Log(((InputAction)obj).activeControl.device);
            var d = ((InputAction)obj).activeControl.device;
            switch (d)
            {
                case Keyboard:
                    anim.Play("keyboard");
                    break;
                case XInputController:
                    anim.Play("xbox");
                    break;
            }
        }
    }

    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Interactable"))
        {
            canPress = true;
        }
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        canPress = false;
    }
}

上面这段代码,当角色碰到可交互对象的时候,就会显示当前设备的按钮,退出的时候就会隐藏按钮

设备切换是通过监听InputSystem.onActionChange实现的

项目相关代码

代码仓库:https://gitee.com/nbda1121440/2DAdventure.git

标签:20240228_1135

标签:场景,人物,void,private,Sign,标识,anim,using,互动
From: https://www.cnblogs.com/hellozjf/p/18039890

相关文章

  • 通过多个字段作为唯一标识对List对象去重
    1、背景List对象定义形式和现有的值如下所示。List<Test>testList=newArrayList<>();[{"ISDEL":"","ATNAM":"Z008_80_PC_4270Y153","AEDTM":"20230808","MATNR":"80.PC......
  • 4-1. 创建人物状态栏
    ColourfulHierarchyCategoryGameObject插件用于美化Hierachy窗口通过查看ColorPalette可以知道用法UIInputSystem冲突我们的项目使用了最新的InputSystem,所以需要按上图所示进行操作,以便UI也可以享受到新InputSystem的福利切图找到Base-UI然后自......
  • Windows 10中还有其他类似的标识符和概念
    Windows10中还有其他类似的标识符和概念。以下是一些常见的:用户名(Username):每个用户在系统中都有一个唯一的用户名,用于登录和识别用户身份。用户ID(UserID):每个用户在系统中都有一个唯一的用户ID,用于在系统级别上标识用户。组(Group):组是一种将多个用户集合在一起的机制。每......
  • 软件版本号解读(语义化SemVer、日历化CalVer及标识符)
    软件版本号解读(语义化SemVer、日历化CalVer及标识符)1.版本控制规范1.1.语义化版本(SemVer)版本格式:主版本号.次版本号.修订号,版本号递增规则:主版本号(MAJORversion):添加了不兼容的API修改,次版本号(MINORversion):添加了向下兼容的功能性新增,修订号(PATCHversion):添加向......
  • 2-10. 人物属性及伤害计算
    场景中添加一只野猪将素材中的野猪图片进行切割,然后给野猪绑定刚体和碰撞体注意需要两个碰撞体第一个碰撞体在脚底,避免野猪掉下去,为了避免这个碰撞体和其它敌人以及玩家产生碰撞,需要排除Player和Enemy层,这样这个碰撞体就只会和平台产生碰撞,避免野猪掉下去第二个碰撞体表......
  • 2-9. 实现人物下蹲逻辑和动画
    动画片段做成动画片段,命名为blueCrouchStart和blueCrouchIdle动画状态机这里我们再接触一个新的东西,Sub-StateMachine,可以通过右键CreateSub-StateMachine来实现点开Crouch,把之前创建好的blueCrouchStart和blueCrouchIdle片段加进来另外添加一个变量,isCrouc......
  • 2-8. 创建人物跳跃动画
    人物跳跃的五个阶段根据这张图把图片切好,并做好动画状态使用BlendTree实现跳跃动画在动画状态机中新建一个BlendTree,然后给它添加三个Motion因为我设置的JumpForce是5,所以人物速度54时候是起跳阶段,41的时候是上升阶段,1~-1的时候是空中换腿阶段,-1以后是下降阶段。虽然......
  • 2-7. 人物行走设定
    目标按住键盘上的左shift键,或者手柄上的左肩键后,人物行动速度变为原来的1/5,这样就能够强制走路了配置inputControl实现相关代码privatevoidAwake(){//获取Player上面的刚体组件rb=GetComponent<Rigidbody2D>();physicsChec......
  • 2-6. 创建人物基本动画
    给帧图片命名添加动画首先需要给Player添加Animator组件然后创建Animations/Player文件夹,并在该文件夹下面添加AnimatorController,起名叫Player然后把Player拖到Animator的Controller上面打开动画状态机Window->Animation->Animator创建Idle动......
  • 2-1. 设置人物及基本组件
    添加刚体在Rigidbody2D上面有GravityScale,这表示人物收到的重力比例是1。重力参数可以通过ProjectSettings->Physics2D,找到Gravity的系数。此外物理更新的FixedUpdate函数会进入,就是因为SimulationMode设置了FixedUpdate另外记得把人物的刚体限制给锁定......