Unity按E拾取物品的两种方式

本节主要介绍如何在unity中实现玩家按E拾取物品的操作,两种方式各有利弊,请按照对应的环境来使用

可拾取物品构建

我们先创建一个cube,作为可拾取物品,并将其名称更改为Item;
修改该物体的tag为Item,为后续代码识别做准备
在这里插入图片描述

为物体再添加一个球形碰撞箱,并设置该球形碰撞箱的半径为4;
球形碰撞箱勾选 is trigger ,因为要检测玩家进入碰撞箱

注意,此时应该存在两个碰撞箱,一个是让物体与场景发生碰撞的盒形碰撞箱,一个是检测玩家靠近的球形碰撞箱!

在这里插入图片描述

最后再给该物体添加一个rigidbody组件,保持默认的参数即可

玩家模块

这里推荐大家前往unity assets下载官方的FPS模板,也就是start assets,
下载完成后将该FPS包导入,设置好角色预制体与相机即可开始使用;

对于触发器trigger的一些解释:
trigger本意就是判断本物体是否进入了另一物体的触发器中,如果进入,就获取被触发对象;
所以没必要说触发器的代码一定要写在被触发对象上,其实直接挂载到任何一方上都是可以的!

具体第一人称视角设置与相关避坑指南将会在下一期为大家介绍,作者时间有限,望大家谅解~

方法一:OnTriggerStay

此方法会有些许延迟,因为从玩家进入到可拾取物体的球形碰撞箱再到触发OnTriggerStay事件时是需要短暂的过渡的,在这期间就可能造成按键E无法拾取的失灵状况;
优点:好理解,代码结构清晰

// 在player.cs中添加如下代码
private void OnTriggerStay(Collider other)
{
  // 检测发送碰撞物体的tag为Item,表示可以被拾取
  if (other.gameObject.tag == "Item")
  {
      Debug.Log("与物品碰撞,按E拾取物体");
      if (Input.GetKeyDown(KeyCode.E))
      {
          // 销毁物体,表示拾取物品
          Destroy(other.gameObject);
          Debug.Log("物体已经被拾取");
      }
  }
}

方法二:标记法

通过设置一个标记canCollect,当玩家进入碰撞范围后设置其为true,表示目前可以拾取;
当玩家退出碰撞范围后设置为false,表示无法拾取;

// 代码同样写在player.cs里面,这里不需要start方法,所以我删掉了

// 初始化canCollect,默认是无法拾取的
private bool canCollect = false;
private GameObject target;
void Update()
{
  // 一旦检测到按下E且符合能拾取条件,就拾取
  if (Input.GetKeyDown(KeyCode.E))
  {
      if(canCollect) Destroy(target);
  }
}

private void OnTriggerEnter(Collider other)
{
  // 判断名称,设置可拾取状态,并将目前碰撞到的对象引用给予target
  if (other.gameObject.tag == "Item")
  {
      canCollect = true;
      target = other.gameObject;
  }
}

private void OnTriggerExit(Collider other)
{
  // 退出碰撞箱范围,禁用拾取,解除target的引用
  if (other.gameObject.tag == "Item")
  {
      canCollect = false;
      target = null;
  }
}

END 后续有更多拾取物品的方式以及相关的优化方法将会在本文章中进行及时的更新,还请多多关注作者支持一下哦~

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>