Unity 2D、C# 2D Raycast 给出奇怪的距离结果
Unity 2D, C# 2D Raycast giving strange distance results
所以我正在尝试使用 2D 光线投射来阻止激光瞄准器在我的游戏中穿墙。
首先,我尝试简单地将激光的终点设置为命中点。然而,这提供了奇怪的结果,生命值似乎在随机位置,通常在玩家身后。
我进行了调试以检查光线投射是否朝向我想要的方式(虽然我知道调试用于 3D 光线投射系统,所以也许我在那里做错了什么?)
然后我尝试使用命中点的距离。它正在工作,有点,当激光击中墙壁时,它会改变它的长度,所以它不会击中墙壁。问题是它在墙前很久就停了,而且也不是在特定点,如果我走近墙,这条线几乎会发生变化,就好像它试图与墙保持一定的距离一样。
这可能是一件非常简单的事情,但我无法解决它。
激光瞄准器在玩家组件的层次结构中处于最深处,其中一些组件具有比例,我想知道这是否可能是奇怪划分的原因,如果是,如何纠正它。
在此先感谢您的帮助!
using UnityEngine;
using System.Collections;
public class LaserSight : MonoBehaviour {
private LineRenderer Lren;
public void Start () {
Lren = GetComponent<LineRenderer>();
}
public void Update() {
if (Lren.enabled) {
int layerMask = (1 << LayerMask.NameToLayer("Wall")) |
(1 << LayerMask.NameToLayer("Enemies"));
//layerMask = ~layerMask;
RaycastHit2D hit = Physics2D.Raycast(transform.position,
transform.right,
layerMask);
if (hit) {
Lren.SetPosition(1,-hit.point);
//Lren.SetPosition(1, new Vector3(hit.distance, 0, 0));
} else {
Lren.SetPosition(1, new Vector3(100, 0, 0));
}
}
}
}
我想我修复了它,问题是将世界 space 转换为本地 space。这是我最终写的代码
using UnityEngine;
using System.Collections;
public class LaserSight : MonoBehaviour {
private LineRenderer Lren;
public void Start () {
Lren = GetComponent<LineRenderer>();
}
public void Update() {
if (Lren.enabled) {
int layerMask = (1 << LayerMask.NameToLayer("Wall")) | (1 << LayerMask.NameToLayer("Enemies"));
RaycastHit2D hit = Physics2D.Raycast( transform.position, transform.right , 100, layerMask);
if (hit) {
Lren.SetPosition(1, new Vector3 (transform.InverseTransformPoint(hit.transform.position).x, 0 , 0));
//Lren.SetPosition(1, new Vector3( hit.distance, 0 , 0));
} else {
Lren.SetPosition(1, new Vector3( 100, 0 , 0));
}
}
}
}
所以我正在尝试使用 2D 光线投射来阻止激光瞄准器在我的游戏中穿墙。
首先,我尝试简单地将激光的终点设置为命中点。然而,这提供了奇怪的结果,生命值似乎在随机位置,通常在玩家身后。
我进行了调试以检查光线投射是否朝向我想要的方式(虽然我知道调试用于 3D 光线投射系统,所以也许我在那里做错了什么?)
然后我尝试使用命中点的距离。它正在工作,有点,当激光击中墙壁时,它会改变它的长度,所以它不会击中墙壁。问题是它在墙前很久就停了,而且也不是在特定点,如果我走近墙,这条线几乎会发生变化,就好像它试图与墙保持一定的距离一样。 这可能是一件非常简单的事情,但我无法解决它。
激光瞄准器在玩家组件的层次结构中处于最深处,其中一些组件具有比例,我想知道这是否可能是奇怪划分的原因,如果是,如何纠正它。
在此先感谢您的帮助!
using UnityEngine;
using System.Collections;
public class LaserSight : MonoBehaviour {
private LineRenderer Lren;
public void Start () {
Lren = GetComponent<LineRenderer>();
}
public void Update() {
if (Lren.enabled) {
int layerMask = (1 << LayerMask.NameToLayer("Wall")) |
(1 << LayerMask.NameToLayer("Enemies"));
//layerMask = ~layerMask;
RaycastHit2D hit = Physics2D.Raycast(transform.position,
transform.right,
layerMask);
if (hit) {
Lren.SetPosition(1,-hit.point);
//Lren.SetPosition(1, new Vector3(hit.distance, 0, 0));
} else {
Lren.SetPosition(1, new Vector3(100, 0, 0));
}
}
}
}
我想我修复了它,问题是将世界 space 转换为本地 space。这是我最终写的代码
using UnityEngine;
using System.Collections;
public class LaserSight : MonoBehaviour {
private LineRenderer Lren;
public void Start () {
Lren = GetComponent<LineRenderer>();
}
public void Update() {
if (Lren.enabled) {
int layerMask = (1 << LayerMask.NameToLayer("Wall")) | (1 << LayerMask.NameToLayer("Enemies"));
RaycastHit2D hit = Physics2D.Raycast( transform.position, transform.right , 100, layerMask);
if (hit) {
Lren.SetPosition(1, new Vector3 (transform.InverseTransformPoint(hit.transform.position).x, 0 , 0));
//Lren.SetPosition(1, new Vector3( hit.distance, 0 , 0));
} else {
Lren.SetPosition(1, new Vector3( 100, 0 , 0));
}
}
}
}