Как я могу одновременно запустить агент navme sh и raycast? - PullRequest
0 голосов
/ 22 апреля 2020

Я пишу код для моего AI моей игры в Unity и хочу запустить в том же коде агент NavMe sh для движения, Raycast и звуковой триггер (в контексте моей игры это враг, который чувствителен к звуку, и если он услышит его, он последует за его источником).

Примечание: Навигация по мне sh агент. Этот компонент прикреплен к мобильному персонажу в игре, чтобы позволить ему перемещаться по сцене, используя NavMe sh

. Raycasting обычно используется в разработке видеоигр для таких вещей, как определение линии обзора игрока

Я пытался запустить 2 отдельных скрипта вместе (Raycast и NavMe sh), но это не сработало. Извините, но я совершенно не знаю, когда дело доходит до кодирования в 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;
        }
    }
}

1 Ответ

0 голосов
/ 23 апреля 2020

Некоторые рекомендации, так как вы не опубликовали полный код. Вы должны быть абсолютно в состоянии сделать все это.

  1. Пожалуйста, нарисуйте линию отладки, чтобы вы могли визуально увидеть, что именно делает ваш raycast: https://docs.unity3d.com/ScriptReference/Debug.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;
}
Проверьте свои физические слои https://docs.unity3d.com/Manual/LayerBasedCollision.html Дважды проверьте правильность тегов Двойной проверить есть ли коллайдеры на вещах
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...