要实现的需求:
在游戏当中,我们的主角走到宝箱前,可以将宝箱打开,走到洞穴口可以进入下一个场景,此时需要有个互动标识来提示用户。如图所示:
当角色走到宝箱前,弹出互动标识提示用户按下E键可以打开宝箱。
我们再额外加一个需求,如果是使用GamePad手柄,则提示按O键。
实现方法和核心代码:
在玩家Player节点下挂载一个空节点Sign,在Sign下挂载一个Sprite节点,也就是互动标识的精灵图。 有需要的话也可以给Sprite加上动画。
需求是当我们走到可互动的物品面前时弹出可互动标识,我们可以给Sign节点设置一个触发器(绿色框框是触发器的触发范围)。
将Sprite节点的Sprite Renderer初始为disabled。
把可互动的对象,如宝箱,设置单独的Tag,并且也设置触发器。
脚本代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;public class Sign : MonoBehaviour {private PlayerInputController inputControl; // 新输入系统private Animator anim; // 动画控制器public GameObject signSprite; // 可互动标识private bool canPress; // 当前是否可以按下互动按键public Transform playerTrans; // 玩家的transformprivate void Awake() {anim = signSprite.GetComponent<Animator>();inputControl = new PlayerInputController();}private void OnEnable() {InputSystem.onActionChange += OnActionChange; // 监听输入操作的状态变化。当输入操作的状态发生改变时,该事件将被触发,}private void Start() {inputControl.Enable();}private void Update() {signSprite.GetComponent<SpriteRenderer>().enabled = canPress;signSprite.transform.localScale = playerTrans.localScale; // 保证玩家无论朝向哪个方向,互动标识都是正的}private void OnActionChange(object obj, InputActionChange actionChange) {// 判断当前的输入设备是键盘还是GamePad手柄,然后显示相应的互动标识if (actionChange == InputActionChange.ActionStarted) {var d = ((InputAction)obj).activeControl.device; // 当前输入设备switch (d.device) {case Keyboard:anim.Play("KeyboardE");break;case Gamepad:anim.Play("Ps");break;}}/*ToDo 互动操作*/}private void OnTriggerStay2D(Collider2D other) {if (other.CompareTag("Interactable")) { // 碰到了可互动对象canPress = true;}}private void OnTriggerExit2D(Collider2D other) {canPress = false;}}
将脚本挂载在Sign节点上。