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
实现的