7-1. 人物可互动标识

场景中叠加场景

将两个场景的公用部分提取到 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

posted @ 2024-02-28 11:59  hellozjf  阅读(42)  评论(0编辑  收藏  举报