Raycast непоследовательный удар по коллайдеру персонажа, но последовательно все остальное - PullRequest
0 голосов
/ 11 июня 2018

Я делаю FPS-игру и пытаюсь написать метод, который определяет, когда враг меня видит.Я делаю это, используя raycasts.

У меня есть проблема, при которой raycast не всегда попадает в (огромный) коробчатый коллайдер, я ожидаю, что он всегда будет попадать.

Raycastпроисходит из моего скрипта AIShooting, и я ожидаю, что он попадет в коллайдер бокса моего персонажа.

Скрипт AIShooting выглядит так:

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

public class AIShooting : MonoBehaviour {

private GameObject _playerCharacter;        //reference to the player controlled character
private CharacterController _playerCharacterController;
private Collider _characterCollider;
private GameObject _characterWeapon;        //reference to the weapon held by the AI
private int _offSetY = 1;                   //offset from player controlled character pivot point, so it shoots the character in the center
                                            //private LineRenderer _lineRenderer;   

// Use this for initialization
void Start () {

    _playerCharacter = GameObject.Find("Character");
    _playerCharacterController = _playerCharacter.GetComponent<CharacterController>();
    _characterWeapon = _playerCharacter.GetComponent<Character>().EquipedWeapons[0];
    _characterCollider = _playerCharacter.GetComponent<BoxCollider>();

}

// Update is called once per frame
void Update () {
    this.transform.LookAt(_playerCharacter.transform);
    LookForEnemyByShootingRayCast();
}

void LookForEnemyByShootingRayCast()
{
    Vector3 _shootTarget = new Vector3(_playerCharacter.transform.position.x, _playerCharacter.transform.position.y + _offSetY, _playerCharacter.transform.position.z);
    RaycastHit hit;
    if (Physics.Raycast(this.transform.position, _shootTarget, out hit, 10000))     //if the ray cast collides with object
    {
        Debug.DrawLine(this.transform.position, _shootTarget, Color.red);           //make the ray cast visible in scene view
        if (hit.transform.name == _characterCollider.transform.name )   //if the raycast hits the character collider
        {
            Debug.Log("THE ENEMY SEES YOU");
        }
        Debug.Log(hit.transform.name);
    }
}
}

Я делаю raycast видимым с Debug.Drawline() и это выглядит такЛуч стреляет от персонажа справа к персонажу слева (с огромным коллайдером).

Однако линия Debug.Log("THE ENEMY SEES YOU"); срабатывает только тогда, когда я действительно очень близко квражеский персонаж, и даже тогда, это происходит в определенных местах и ​​совсем не согласовано.

Raycast display

Заранее спасибо!

1 Ответ

0 голосов
/ 11 июня 2018

Метод Physics.Raycast () принимает направление в качестве второго параметра вместо целевой позиции
https://docs.unity3d.com/ScriptReference/Physics.Raycast.html
Функция Debug.DrawLine () работает, потому что она занимает две позиции вместо позиции и направления.

Вы можете рассчитать направление, как это

Vector3 _shootTarget = new Vector3(_playerCharacter.transform.position.x, _playerCharacter.transform.position.y + _offSetY, _playerCharacter.transform.position.z);
Vector3 _direction = _shootTarget - this.transform.position;
...