【问题标题】:Raycast hitting collider of character inconsistently, but hitting everything else consistentlyRaycast 不一致地击中角色的对撞机,但一致地击中其他一切
【发布时间】:2018-11-20 12:15:33
【问题描述】:

我正在制作一个 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"); 这条线只有在我非常非常接近敌方角色时才会触发,即便如此,它也会在某些位置发生并且根本不一致。

提前致谢!

【问题讨论】:

  • 尝试使用 if (hit.collider == _characterCollider) 而不是按名称进行比较。

标签: c# unity3d character raycasting collider


【解决方案1】:

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;

【讨论】:

  • 谢谢!我一定是因为DrawLine() 方法的工作方式而感到困惑。现在按预期工作!
  • 不客气。祝你好运,玩得开心。
【解决方案2】:

我知道这已经很老了,但我花了很长时间才弄清楚,任何类型的光线投射来击中连接到具有非运动学刚体和 NAVMESH 代理的对象的对撞机都会返回极其不一致的命中。在这种情况下,刚体应该是运动学的。

【讨论】:

  • 你这个英雄!我一直在反对这一点。对于我们这些菜鸟来说,在刚体上将 IsKinematic 设置为 true 会产生什么后果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
相关资源
最近更新 更多