我有一个门动画,当玩家在门附近按“E”时可以播放该动画。我有一个脚本可以控制它,并且我有一个单独的 AI 角色脚本,该角色应该通过设置的路径点来追逐你。
该脚本附加到一个盒子触发器上,输入时会打开门。当 AI 角色打开门时,盒子碰撞器会在触发对象上禁用,如果门碰巧关闭,它会重新启用。
我在玩家用于门交互的脚本上有一个名为“doorOpen”的布尔值。我一直尝试在 AI 脚本中调用它,尽管也在 AI 脚本中调用了playerdoorinteraction 脚本,但 bool 似乎没有被调用,甚至没有被识别,甚至可能被忽略。是的,我也尝试过某些事情,比如清理我的代码。有人可以帮帮我吗?我将在下面发布我的两个脚本。
**using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.AI;
using Unity.VisualScripting;
public class TerryDoorOpen : MonoBehaviour
{
[SerializeField] private Animator myDoor = null;
//PlayerDoorInteractionAlternate PlayerDoor;
//public bool doorOpen = false;
public GameObject Door;
private PlayerDoorInteractionAlternate script;
public Collider boxCollider;
public float offsetTime = 2f;
private float Timer = 0f;
//private bool doorOpen;
//[SerializeField] private bool openTrigger = false;
//[SerializeField]private bool closeTrigger = false;
public NavMeshObstacle Obstacle;
public void OnTriggerEnter(Collider other)
{
bool doorOpen = Door.GetComponent<PlayerDoorInteractionAlternate>();
if (other.CompareTag("TerryEnemy")&& !doorOpen)
{
boxCollider.enabled = true;
myDoor.Play("dooropenrotationonly",0,0.0f);
//Obstacle.enabled = true;
doorOpen = true;
//if (openTrigger)
{
//myDoor.Play("dooropen",0,0.0f);
//gameObject.SetActive(false);
//Obstacle.enabled = true;
}//else if (closeTrigger)
{
//myDoor.Play("doorclose", 0, 0.0f);
//gameObject.SetActive(false);
//Obstacle.enabled = false;
}
}
else if(other.CompareTag("TerryEnemy")&& doorOpen)
{
//myDoor.Play("doorcloserotationonly", 0,0.0f);
//Obstacle.enabled = false;
doorOpen = false;
boxCollider.enabled = false;
}
}
// Start is called before the first frame update
void Start()
{
//PlayerDoorInteractionalternate = PlayerDoorScript.GetComponent<PlayerDoorInteractionAlternate>;
}
// Update is called once per frame
void Update()
{
}
}**
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class PlayerDoorInteractionAlternate : MonoBehaviour
{
private Animator doorAnim;
public bool doorOpen = false;
private void Awake()
{
doorAnim = gameObject.GetComponent<Animator>();
}
public void PlayAnimationAlternate()
{
if (!doorOpen)
{
doorAnim.Play("dooropenrotationonly", 0, 0.0f);
doorOpen = true;
}
else
{
doorAnim.Play("doorcloserotationonly", 0, 0.0f);
doorOpen = false;
}
}
}
是的,我已经尝试了很多高级和简单的事情,比如清理我的代码,有人可以帮助我吗,我将在下面发布我的两个脚本。我尝试从我在脚本中调用的游戏对象调用脚本,并认为这会起作用,但事实并非如此。
问题是这里的这一行
bool doorOpen = Door.GetComponent<PlayerDoorInteractionAlternate>();
您正在通过隐式转换将组件转换为布尔值。
相反,从该组件访问
doorOpen
变量。
一个有很大帮助的小改变是将
Door
的类型(应该是 door
)从 GameObject
更改为其实际类型。那么您就不需要使用 GetComponent 并可以直接访问该脚本。这对于了解您是否打算统一开发非常方便。
public PlayerDoorInteractionAlternate door;
我还注意到您在触发函数中将本地 bool
doorOpen
设置为 true 和 false。将该变量设置为 true 或 false 不会修改其他脚本上的值。请参阅值类型了解解释和示例。
摘录:
对值类型变量的操作仅影响存储在变量中的值类型的实例。
按照我建议的更改,您的代码最终会变成这样:
if (other.CompareTag("TerryEnemy"))
{
if (door.doorOpen)
{
boxCollider.enabled = false;
door.doorOpen = false;
}
else
{
boxCollider.enabled = true;
myDoor.Play("dooropenrotationonly",0,0.0f);
door.doorOpen = true;
}
}
我不确定这是否会按照您期望的方式工作,但它确实修复了代码中的多个问题并解决了原来的问题。