学习unity第四天,学艺不精的情况下上手了,不知道怎么构建框架,不会用事件把game和ui分开,全写在一个文件里了。
效果图是这样的
远离门时:
靠近门后(显示一个交互提示,离开时会消失):
我先是写好了开关门的脚本DoorsController(详见上一篇),然后其中有一个判断玩家接近的方法
private bool IsPlayerNearDoor()
{
// 假设玩家有一个名为PlayerTag的标签
Collider[] colliders = Physics.OverlapBox(doorCollider.bounds.center, doorCollider.bounds.size * 0.5f); // 使用门的中心和大小来检测碰撞体
foreach (Collider col in colliders)
{
if (col.CompareTag("Player")) // 检查碰撞体是否有"Player"标签
{
return true; // 如果找到带有"PlayerTag"标签的碰撞体,则返回true
}
}
return false; // 如果没有找到,则返回false
}
接下来我就是用这个方法实现这一功能的。
首先是触发器组件有三个自带的API
OnTriggerEnter、OnTriggerStay、OnTriggerExit
第一个进入区域执行一次,第二个是在区域内一直执行,第三个是离开时执行一次。
所以显而易见,我们需要用到OnTriggerEnter和OnTriggerExit
public bool isInfor = false;
public GameObject InforTip;
private void OnTriggerEnter(Collider other)
{
InforTip.SetActive(isInfor = !isInfor);
}
private void OnTriggerExit(Collider other)
{
InforTip.SetActive(isInfor = !isInfor);
}
然后出去以后把组件绑定一下~
然后就可以啦。
我的DoorsController如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class DoorsController : MonoBehaviour
{
private Animator anim; // 动画控制器组件
private bool isOpen = false; // 记录门是否打开
private Collider doorCollider; // 门的碰撞体组件
public bool isInfor = false;
public GameObject InforTip;
// Start is called before the first frame update
void Start()
{
anim = GetComponent<Animator>(); // 获取动画控制器组件
doorCollider = GetComponent<Collider>(); // 获取门的碰撞体组件
// 初始设置门不是触发器
doorCollider.isTrigger = false;
}
// Update is called once per frame
void Update()
{
// 如果门是打开的且玩家按下了E键,则关闭门
if (isOpen && Input.GetKeyDown(KeyCode.E))
{
CloseDoor();
}
// 如果门是关闭的且玩家按下了E键,并且玩家与门发生了碰撞,则打开门
else if (!isOpen && Input.GetKeyDown(KeyCode.E) && IsPlayerNearDoor())
{
OpenDoor();
}
}
private void OpenDoor()
{
// 触发开门动画
anim.SetTrigger("Open");
// 将门设置为触发器,允许玩家穿过
doorCollider.isTrigger = true;
isOpen = true; // 标记门为打开状态
}
private void CloseDoor()
{
// 触发关门动画
anim.SetTrigger("Close");
// 如果之前将门设置为触发器,现在关闭时应该将其改回非触发器状态
doorCollider.isTrigger = false;
isOpen = false; // 标记门为关闭状态
}
// 检查玩家是否接近门(通过碰撞器检测)
private bool IsPlayerNearDoor()
{
// 假设玩家有一个名为PlayerTag的标签
Collider[] colliders = Physics.OverlapBox(doorCollider.bounds.center, doorCollider.bounds.size * 0.5f); // 使用门的中心和大小来检测碰撞体
foreach (Collider col in colliders)
{
if (col.CompareTag("Player")) // 检查碰撞体是否有"Player"标签
{
//InforTip.SetActive(isInfor = !isInfor);//对附近的门显示交互提示
return true; // 如果找到带有"PlayerTag"标签的碰撞体,则返回true
}
}
return false; // 如果没有找到,则返回false
}
private void OnTriggerEnter(Collider other)
{
InforTip.SetActive(isInfor = !isInfor);
}
private void OnTriggerExit(Collider other)
{
InforTip.SetActive(isInfor = !isInfor);
}
}
版权归原作者 椰椰燕麦奶 所有, 如有侵权,请联系我们删除。