学unity第四天,开始折磨了
要做一个玩家靠近时按E可以打开的门。
介绍一下我的文件结构
、
一个已经准备好open和close的animation的door,脚本名为DoorsController
门的资源我下载的是asset store里的这个
具体怎么创建动画等等我看了b站的这个教程【如何在Unity中实现开关门的动作效果(作者:邓嘉欣)】 https://www.bilibili.com/video/BV1mg4y197bd/?share_source=copy_web&vd_source=e9e2073763d542d266bf658aa82b61d8,就不赘述了
做完之后我发现,角色可以直接从门内穿模穿过(哪怕不开门),所以我学习了一下box collider和ridigbody的功课,发现问题出在component中的box collider(盒型触发器)上。
因为具有触发器属性的物体类似的成为了游戏里一个可以触发事件的“区域”,所以它将不再具有物理体积。所以只要isTrigger被勾选上了,物体就会变得可穿透。
因此我考虑可以在门还未进行open的animation时不可穿透,而在open之后可穿透。
所以我使用了if语句更改isTrigger的方法:
// 将门设置为触发器,允许玩家穿过
doorCollider.isTrigger = true;
像这样。然后再加一点逻辑进去就好啦。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoorsController : MonoBehaviour
{
private Animator anim; // 动画控制器组件
private bool isOpen = false; // 记录门是否打开
private Collider doorCollider; // 门的碰撞体组件
// 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"标签
{
return true; // 如果找到带有"PlayerTag"标签的碰撞体,则返回true
}
}
return false; // 如果没有找到,则返回false
}
}
这样就完成了,然后,如果不行的话善用debug.log()找一下哪里出问题了。
这就是今天的成果啦,祝好!