【问题标题】:Unity 2D, C# 2D Raycast giving strange distance resultsUnity 2D,C# 2D Raycast 给出奇怪的距离结果
【发布时间】:2016-01-30 10:00:44
【问题描述】:

所以我正在尝试使用 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));
            }
        }
    }
}

【问题讨论】:

    标签: c# unity3d 2d raycasting


    【解决方案1】:

    我想我已经解决了,问题在于将世界空间转换为本地空间。这是我最终编写的代码

    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));
                }
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 2016-12-13
      • 2019-01-06
      • 2021-06-18
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多