要实现的需求:
在游戏当中,我们的主角走到宝箱前,可以将宝箱打开,走到洞穴口可以进入下一个场景,此时需要有个互动标识来提示用户。如图所示:
当角色走到宝箱前,弹出互动标识提示用户按下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; // 玩家的transform
private 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节点上。