如何同时运行Navmesh代理和Raycast?

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

我在Unity中为我的游戏中的AI编写代码,我想在同一代码中运行NavMesh代理的移动、Raycast和声音触发(在我的游戏中,这是一个对声音敏感的敌人,如果它听到声音,它将跟随声音的来源)。

注 。 导航网状代理。这个组件被附加到游戏中的移动角色上,让它使用NavMesh导航场景

Raycasting在视频游戏开发中通常用于确定玩家的视线等。

我试过将2个单独的脚本一起运行(Raycast和NavMesh),但没有成功。很抱歉,但我对C#的编码完全不了解。

这是我写的代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IAVISIBILIDAD : MonoBehaviour
{
    public Transform target;
    public float moveSpeed = 3;
    public float rotationSpeed = 3;
    public float distance = 5f;
    public bool Enabled = false;
    public bool Detect = false;
    private Transform myTransform;


    void Awake()
    {
        myTransform = this.GetComponent<Transform>();
    }

    void Start()
    {
        target = GameObject.FindWithTag("Player").transform;
    }

    void Update()
    {
        if (Enabled)
        {
            myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
            RaycastHit info;
            Debug.DrawRay(transform.position, transform.forward * distance, Color.red, 0.1f);
            if (Physics.Raycast(transform.position, transform.forward, out info, distance))
            {
                if (info.collider.tag == "Player")
                {
                    Detect = true;
                }
                else
                {
                    Detect = false; 
                }
            }
            else
            {
                Detect = false;
            }
        }
        if (Enabled && Detect)
        {
            myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            Enabled = true;
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.tag == "Player")
        {
            Enabled = false;
        }
    }
}
c# unity3d
1个回答
0
投票

一些建议,因为你没有发布完整的代码。你应该绝对可以做到这些。

  1. 请画一条调试线,这样你就可以直观地看到你的raycast到底在做什么。 https:/docs.unity3d.comScriptReferenceDebug.DrawLine.html
  2. 在你的代码中做一些Debug.Logs,以弄清楚到底发生了什么,也就是。

例子

if (Physics.Raycast(transform.position, transform.forward, out info, distance))
{
    Debug.Log("Collided with: " + info.collider.tag}");
    if (info.collider.tag == "Player")
    {
        Detect = true;
    }
    else
    {
        Detect = false; 
    }
}
else
{
    Debug.Log("Failed to collide with anything");
    Detect = false;
}
  1. 检查您的物理层 https:/docs.unity3d.comManualLayerBasedCollision.html。
  2. 仔细检查标签是否正确
  3. 仔细检查东西上是否有碰撞器
© www.soinside.com 2019 - 2024. All rights reserved.