Raycast 不一致地击中角色的对撞机,但一致地击中其他一切
Raycast hitting collider of character inconsistently, but hitting everything else consistently
我正在制作一款 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");
只有在我非常非常接近敌人角色时才会触发,即便如此,它也会发生在某些位置并且根本不一致。
提前致谢!
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;
我知道这太老了,但我只是花了很长时间才弄清楚任何类型的光线投射都会击中附在带有 non-kinematic 刚体和 NAVMESH 代理的对象上的对撞机 return 极其不一致的点击。在这种情况下,刚体应该是运动学的。
我正在制作一款 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");
只有在我非常非常接近敌人角色时才会触发,即便如此,它也会发生在某些位置并且根本不一致。
提前致谢!
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;
我知道这太老了,但我只是花了很长时间才弄清楚任何类型的光线投射都会击中附在带有 non-kinematic 刚体和 NAVMESH 代理的对象上的对撞机 return 极其不一致的点击。在这种情况下,刚体应该是运动学的。