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

要实现的需求:

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

当角色走到宝箱前,弹出互动标识提示用户按下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节点上。 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值