1

私は FPS ゲームを作成しており、敵がいつ私を見ることができるかを検出するメソッドを作成しようとしています。レイキャストを使用してこれを行います。

レイキャストが常に (巨大な) ボックス コライダーにヒットするとは限らないという問題があります。

レイキャストは 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);
    }
}
}

でレイキャストを見えるようにすると、Debug.Drawline()このようになります。レイは右側のキャラクターから左側のキャラクターに向けて発射されます (巨大なボックスコライダーを使用)。

ただし、ラインDebug.Log("THE ENEMY SEES YOU");は敵キャラクターに非常に近い場合にのみトリガーされ、その場合でも、特定の場所で発生し、まったく一貫していません.

レイキャスト表示

前もって感謝します!

4

2 に答える 2

1

私はこれが非常に古いことを知っていますが、非キネマティック Rigidbody と NAVMESH AGENT を持つオブジェクトに取り付けられたコライダーをヒットするあらゆる種類のレイキャストが非常に一貫性のないヒットを返すことを理解するのに長い時間を費やしました。この場合、リジッドボディはキネマティックでなければなりません。

于 2020-08-14T15:18:37.217 に答える