Unity《勇士传说》开发日记:如何制作可互动标识

要实现的需求:

在游戏当中,我们的主角走到宝箱前,可以将宝箱打开,走到洞穴口可以进入下一个场景,此时需要有个互动标识来提示用户。如图所示:

Unity《勇士传说》开发日记:如何制作可互动标识_第1张图片

当角色走到宝箱前,弹出互动标识提示用户按下E键可以打开宝箱。

Unity《勇士传说》开发日记:如何制作可互动标识_第2张图片

 

我们再额外加一个需求,如果是使用GamePad手柄,则提示按O键。

实现方法和核心代码:

Unity《勇士传说》开发日记:如何制作可互动标识_第3张图片

 Unity《勇士传说》开发日记:如何制作可互动标识_第4张图片

在玩家Player节点下挂载一个空节点Sign,在Sign下挂载一个Sprite节点,也就是互动标识的精灵图。 有需要的话也可以给Sprite加上动画。

Unity《勇士传说》开发日记:如何制作可互动标识_第5张图片

Unity《勇士传说》开发日记:如何制作可互动标识_第6张图片 

 Unity《勇士传说》开发日记:如何制作可互动标识_第7张图片

需求是当我们走到可互动的物品面前时弹出可互动标识,我们可以给Sign节点设置一个触发器(绿色框框是触发器的触发范围)。

将Sprite节点的Sprite Renderer初始为disabled。

Unity《勇士传说》开发日记:如何制作可互动标识_第8张图片

把可互动的对象,如宝箱,设置单独的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();
        inputControl = new PlayerInputController();
    }

    private void OnEnable() {
        InputSystem.onActionChange += OnActionChange;   // 监听输入操作的状态变化。当输入操作的状态发生改变时,该事件将被触发,
    }

    private void Start() {
        inputControl.Enable();
    }

    private void Update() {
        signSprite.GetComponent().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;
    }

}

Unity《勇士传说》开发日记:如何制作可互动标识_第9张图片

将脚本挂载在Sign节点上。 

你可能感兴趣的:(#,Unity,unity,游戏引擎)