我有一个盒子碰撞器,应该像人工智能的视图,我有一个球员,有一个胶囊碰撞器和游戏对象的名称是"玩家".当我使用构建它void,即OnCollisionEnter和退出(顺便说一句,这没有工作,即使我使用的触发版本的void),它只是不检测到它.我试着判断是否玩家作为一个游戏对象与视觉碰撞器碰撞与"Equals()"命令,这没有工作.我附上了图片和我的整个人工智能脚本,如果有人知道如何解决这个问题.

zombie with vision collider

The box collider placed so it works with the script

和脚本

    using System;
    using UnityEngine;
    using UnityEngine.AI;

    namespace Demo.Scripts.Runtime
    {
        public class AI : MonoBehaviour
        {
            [Tab("Main")]
            [Header("Zombie States")]
            [SerializeField] public bool is_Chasing_Player;
            [SerializeField, Range(0f, 10f)] public float speed = 5f;

            [Tab("Navigation")]
            [Header("NavMesh Stuff")]
            [SerializeField] public NavMeshAgent agent;
            [SerializeField] public Collider vision_Collider;

            [Header("Player Location")]
            [SerializeField] public Transform player;

            [Tab("Animation")]
            [Header("Head Animator")]
            [SerializeField] public Animator animator;

            [Header("Animator Controllers")]
            [SerializeField] public RuntimeAnimatorController idle;
            [SerializeField] public RuntimeAnimatorController walk;
            [SerializeField] public RuntimeAnimatorController die;

            private int count = 0;

            private void Start()
            {
                animator.runtimeAnimatorController = idle;
                agent = GetComponent<NavMeshAgent>();
                animator = GetComponent<Animator>();
            }

            private void Update()
            {
                ZombieDie();
                if (player != null && is_Chasing_Player)
                {
                    if (count == 0)
                    {
                        animator.runtimeAnimatorController = walk;
                        count++;
                    }
                    agent.SetDestination(player.position);
                    agent.speed = speed;
                }
                if (!is_Chasing_Player && animator.runtimeAnimatorController != idle)
                {
                    animator.runtimeAnimatorController = idle;
                }
            }

            public void ZombieDie()
            {
                if (Input.GetKeyDown(KeyCode.I))
                {
                    animator.runtimeAnimatorController = die;
                    agent.speed = 0;
                    speed = 0;
                }
            }

            private void OnCollisionEnter(Collision collision)
            {
                if (collision.collider.CompareTag("Player"))
                {
                    Debug.Log("Player entered vision collider");
                }
            }

        private void OnCollisionExit(Collision collision)
            {
                if (collision.collider.CompareTag("Player"))
                {
                    Debug.Log("Player exited vision collider");
                }
            }
        }
    }
        

当玩家与视觉碰撞器碰撞时,我正试图在控制台上写一句话.

推荐答案

当选中"isTrigger"时,使用OnTriggerEnter而不是OnCollision.

documentation说:

必须启用Collider.isTrigger,并包含刚体

因此,添加一个rigidbody到你的代理,并标记它"isKinematic".

当它们都没有刚体时,物理引擎不会期望它们移动,从而发生碰撞.如果你通过脚本(navmesh代理)移动对象,你需要一个运动刚体.

Csharp相关问答推荐

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

在WPF.NET 6中使用C++/WinRT组件(但实际上是任何WinRT组件)

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

为什么C#Bigbit不总是相同的比特长度?

C#中浮点数的System.Text.Json序列化问题

Swagger没有显示int?可以为空

关于扩展文件类C#的矛盾

链接到字典字符串.拆分为(.Key,.Value)

如何返回具有泛型的类?

如何在特定环境中运行dotnet测试?

序列化过程中的死循环

try 访问字典中的模拟对象时引发KeyNotFoundException

除非首先访问使用的终结点,否则本地API上的终结点不起作用

在使用xUnit和Mock执行单元测试时,控制器ViewResult返回空的Model集合

客户端/服务器RPC如何处理全局变量?

我可以阻止类型上的Object.ToString()吗?

为什么INTEGER在通过反射调用时对空对象返回TRUE,而在INTEGER上调用时返回FALSE?

SendInput无法在C#中正确模拟键盘