我的 Raycast 似乎没有任何范围 - 仅检测放置在发射游戏对象旁边的对象
My Raycast does not seem to have any range - only detects objects placed next to emitting gameobject
我正在使用以下代码(来自:https://gist.github.com/valryon/566c02f3c5808dcd9968)在我的游戏中生成二维激光。激光器具有开始、中间和结束部分。构成激光并被子代到父游戏对象。
public class LaserScript : MonoBehaviour
{
[Header("Laser pieces")]
public GameObject laserStart;
public GameObject laserMiddle;
public GameObject laserEnd;
private GameObject start;
private GameObject middle;
private GameObject end;
void Update()
{
// Create the laser start from the prefab
if (start == null)
{
start = Instantiate(laserStart) as GameObject;
start.transform.parent = this.transform;
start.transform.localPosition = Vector2.zero;
}
// Laser middle
if (middle == null)
{
middle = Instantiate(laserMiddle) as GameObject;
middle.transform.parent = this.transform;
middle.transform.localPosition = Vector2.zero;
}
// Define an "infinite" size, not too big but enough to go off screen
float maxLaserSize = 200f;
float currentLaserSize = maxLaserSize;
// Raycast at the right as our sprite has been design for that
Vector2 laserDirection = this.transform.right;
RaycastHit2D hit = Physics2D.Raycast(this.transform.position, laserDirection, maxLaserSize);
Debug.Log(hit.collider.tag);
if (hit.collider.tag == "Enemy")
{
// We touched something!
// -- Get the laser length
currentLaserSize = Vector2.Distance(hit.point, this.transform.position);
// -- Create the end sprite
if (end == null)
{
end = Instantiate(laserEnd) as GameObject;
end.transform.parent = this.transform;
end.transform.localPosition = Vector2.zero;
}
}
else
{
// Nothing hit
// -- No more end
if (end != null) Destroy(end);
}
// Place things
// -- Gather some data
float startSpriteWidth = start.GetComponent<Renderer>().bounds.size.x;
float endSpriteWidth = 0f;
if (end != null) endSpriteWidth = end.GetComponent<Renderer>().bounds.size.x;
// -- the middle is after start and, as it has a center pivot, have a size of half the laser (minus start and end)
middle.transform.localScale = new Vector3(currentLaserSize - startSpriteWidth, middle.transform.localScale.y, middle.transform.localScale.z);
middle.transform.localPosition = new Vector2((currentLaserSize / 2f), 0f);
// End?
if (end != null)
{
end.transform.localPosition = new Vector2(currentLaserSize, 0f);
}
}
}
脚本应该有如下gif所示的效果:
但是我的激光只有在物体刚好在它前面时才会检测到物体,只有当激光的起始部分真正接触到敌人时,Debug.Log
才会报告 Enemy
否则它是未知的.
我得到了 gif 中所示的预期效果,但是我的光线投射没有检测到任何敌人,直到发射激光的玩家站在敌人旁边。
这可能是什么原因?
谢谢
Physics.Raycast()
return 是 boolean
,不是 RaycastHit
。
使用以下语法来return碰撞器的信息:
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);
此代码检查 Raycast 是否命中某些东西并将碰撞器的信息存储在命中中:
RaycastHit hit;
if(Physics.Raycast(transform.position, laserDirection, out hit, maxLaserSize))
{
Debug.Log(hit.collider.tag);
}
我正在使用以下代码(来自:https://gist.github.com/valryon/566c02f3c5808dcd9968)在我的游戏中生成二维激光。激光器具有开始、中间和结束部分。构成激光并被子代到父游戏对象。
public class LaserScript : MonoBehaviour
{
[Header("Laser pieces")]
public GameObject laserStart;
public GameObject laserMiddle;
public GameObject laserEnd;
private GameObject start;
private GameObject middle;
private GameObject end;
void Update()
{
// Create the laser start from the prefab
if (start == null)
{
start = Instantiate(laserStart) as GameObject;
start.transform.parent = this.transform;
start.transform.localPosition = Vector2.zero;
}
// Laser middle
if (middle == null)
{
middle = Instantiate(laserMiddle) as GameObject;
middle.transform.parent = this.transform;
middle.transform.localPosition = Vector2.zero;
}
// Define an "infinite" size, not too big but enough to go off screen
float maxLaserSize = 200f;
float currentLaserSize = maxLaserSize;
// Raycast at the right as our sprite has been design for that
Vector2 laserDirection = this.transform.right;
RaycastHit2D hit = Physics2D.Raycast(this.transform.position, laserDirection, maxLaserSize);
Debug.Log(hit.collider.tag);
if (hit.collider.tag == "Enemy")
{
// We touched something!
// -- Get the laser length
currentLaserSize = Vector2.Distance(hit.point, this.transform.position);
// -- Create the end sprite
if (end == null)
{
end = Instantiate(laserEnd) as GameObject;
end.transform.parent = this.transform;
end.transform.localPosition = Vector2.zero;
}
}
else
{
// Nothing hit
// -- No more end
if (end != null) Destroy(end);
}
// Place things
// -- Gather some data
float startSpriteWidth = start.GetComponent<Renderer>().bounds.size.x;
float endSpriteWidth = 0f;
if (end != null) endSpriteWidth = end.GetComponent<Renderer>().bounds.size.x;
// -- the middle is after start and, as it has a center pivot, have a size of half the laser (minus start and end)
middle.transform.localScale = new Vector3(currentLaserSize - startSpriteWidth, middle.transform.localScale.y, middle.transform.localScale.z);
middle.transform.localPosition = new Vector2((currentLaserSize / 2f), 0f);
// End?
if (end != null)
{
end.transform.localPosition = new Vector2(currentLaserSize, 0f);
}
}
}
脚本应该有如下gif所示的效果:
但是我的激光只有在物体刚好在它前面时才会检测到物体,只有当激光的起始部分真正接触到敌人时,Debug.Log
才会报告 Enemy
否则它是未知的.
我得到了 gif 中所示的预期效果,但是我的光线投射没有检测到任何敌人,直到发射激光的玩家站在敌人旁边。
这可能是什么原因?
谢谢
Physics.Raycast()
return 是 boolean
,不是 RaycastHit
。
使用以下语法来return碰撞器的信息:
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);
此代码检查 Raycast 是否命中某些东西并将碰撞器的信息存储在命中中:
RaycastHit hit;
if(Physics.Raycast(transform.position, laserDirection, out hit, maxLaserSize))
{
Debug.Log(hit.collider.tag);
}