Raycast от NPC - PullRequest
       4

Raycast от NPC

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

У меня есть NP C в моей игре, и он мне нужен, чтобы определить позицию игрока. Я пытаюсь использовать raycast для этой цели. Когда игрок находится перед NP C, он может его обнаружить. Это 3D тактическая ролевая игра. Каждый персонаж может перемещать только одну плитку за ход.

Однако проблема в том, что он не может определить, находится ли игрок слева, справа или позади него. Есть ли способ, которым я могу изменить углы Raycast?

Я создал эту сопрограмму для использования raycast от NP C. Я вызываю эту сопрограмму в методе Start:

ienumerator detectplayer()
    {
        yield return new waitforseconds(1f);

        ray ray = new ray();
        raycasthit hit;

        ray.origin = transform.position + transform.forward;
        ray.direction = transform.forward;

        vector3 foward = transform.transformdirection(vector3.forward) * 10;

        float duration = 15f;

        debug.drawray(ray.origin, foward, color.red, duration);

        if (physics.raycast(ray, out hit))
        {
            print("the game object" + hit.collider.gameobject.name + "is in front of the npc");

        }
    }

Ответы [ 2 ]

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

Я вроде нашел это «решение» для своей проблемы, я не знаю, является ли это лучшим способом ее решения, однако пока это работает:

IEnumerator DetectPlayer()
    {
        yield return new WaitForSeconds(1f);

        Ray frontRay = new Ray();
        RaycastHit hit;

        frontRay.origin = transform.position + transform.forward;
        frontRay.direction =  transform.forward;

        Vector3 foward = transform.TransformDirection(Vector3.forward) * 10;
        float duration = 15f;
        Debug.DrawRay(frontRay.origin, foward, Color.red, duration);

        if (Physics.Raycast(frontRay, out hit))
        {
            print("The game object " + hit.collider.gameObject.name + "is in front of the npc");
        }

        if(Physics.Raycast(transform.position,-transform.right,out hit))
        {
            print("The game object " + hit.collider.gameObject.name + " is on the right of the npc");
        }

        if(Physics.Raycast(transform.position, transform.right,out hit))
        {
            print("The game object " + hit.collider.gameObject.name + " is on the left of the npc");
        }

        if(Physics.Raycast(transform.position, -transform.forward,out hit))
        {
            print("The game object " + hit.collider.gameObject.name + " is behind the npc");
        }
    }

Я называю эту сопрограмму внутри в методе Старт. Было бы неправильно, если бы он вызывался в методе Update?

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

Я предполагаю, что вы используете Unity? в этом случае вы можете использовать Physics.OverlapSphere и проверить коллайдеры для игрока

Пример:

Collider[] colliders = Physics.OverlapSphere(NPC.transform.position, HOW FAR THE NPC CAN SEE);
for(int i = 0; i < colliders.length; i++){
  if(colliders[i].gameObject.tag == "player"){
    //DO SOMETHING
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...