为什么我的盒子碰撞器没有禁用,而我应该已经在脚本中调用了正确的布尔值?

问题描述 投票:0回答:1

我有一个门动画,当玩家在门附近按“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;
        }
 
    }
}

是的,我已经尝试了很多高级和简单的事情,比如清理我的代码,有人可以帮助我吗,我将在下面发布我的两个脚本。我尝试从我在脚本中调用的游戏对象调用脚本,并认为这会起作用,但事实并非如此。

c# unity-game-engine boolean game-development
1个回答
0
投票

问题是这里的这一行

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;
        
    }
}

我不确定这是否会按照您期望的方式工作,但它确实修复了代码中的多个问题并解决了原来的问题。

© www.soinside.com 2019 - 2024. All rights reserved.