Unity LineRenderer - 无法设置位置

Posted

技术标签:

【中文标题】Unity LineRenderer - 无法设置位置【英文标题】:Unity LineRenderer - unable to set positions 【发布时间】:2020-06-18 15:18:23 【问题描述】:

这链接到我之前关于无法获得对 Unity LineRenderer 的引用的问题。暂时绕过那个,虽然仍然不明白问题是什么。但是现在,有了 LineRenderer 引用,就不能用它做任何事情了。

LineRenderer 正在以编程方式添加,并在 Awake() 中获得了一个引用,然后在需要时需要访问它,添加大量点并显示它。但我不能 - 不会编译。代码是

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    //////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////

    public class Test : MonoBehaviour
    
        LineRenderer
                lineOfFlight;

        void Awake()
        
            GameObject
                    lineObject = new GameObject("Line");

            lineOfFlight = lineObject.AddComponent<LineRenderer>();
        

        void Start()  

        void Update()
        
            List<Vector3>
                    savedBuffer = new List<Vector3>();  //  added for test
            Vector3[]
                    positions = new Vector3[3000];
            int     index = 0;

            foreach (Vector3 m in savedBuffer)
                positions[index++] = new Vector3(index, index, index);

            lineOfFlight.SetPositions(positions);
        

    

它在 Awake() 中设置 OK。

错误是 lineOfFlight(LineRenderer 类型)没有称为 SetPositions() 的方法 - 根据它所做的 Unity 手册,我找不到它所具有的任何用于设置位置的方法。它只有标准的 GameObject 方法。

这是 Unity 手册示例(在 Update() 中):

    LineRenderer lineRenderer = GetComponent<LineRenderer>();
    var points = new Vector3[lengthOfLineRenderer];
    var t = Time.time;
    for (int i = 0; i < lengthOfLineRenderer; i++)
    
        points[i] = new Vector3(i * 0.5f, Mathf.Sin(i + t), 0.0f);
    
    lineRenderer.SetPositions(points);

那么有什么不同呢?

我错过了这里的重点 - 应该如何访问这些组件?我之前在其他组件上发现过这个问题 - 显然我不明白如何在 Unity 中获取 API。

该类派生自MonoBehaviour,包含UnityEngine。

停止新闻:

已创建测试文件 Test.cs - 仅包含关键位 - 现在如上所示(替换原始示例)。不会做很多事情(在 savedBuffer 中什么都没有),但应该编译?在lineOfFlight.SetPositions(positions); 行上出现完全相同的错误。

我也试过GetComponent&lt;LineRenderer&gt;().SetPositions(positions); - 完全相同:“'LineRenderer' 不包含'SetPositions' 的定义,并且找不到接受'LineRenderer' 类型的第一个参数的可访问扩展方法'SetPositions'(你是缺少 using 指令或程序集引用?)[Assembly-CSharp]csharp(CS1061)"。

【问题讨论】:

你能在你定义lineOfFlight的地方包含代码吗? 我已经添加了。 能否按原样添加相关代码?问题中的代码无论如何都不会编译(没有返回类型,“....”等)。这使我们更难帮助您确定问题所在,因为在使代码可编译时,我们可能会在不知不觉中解决您遇到的问题。 这是一个相当大的文件,我不想砍掉它,因为问题可能会改变。这是整个文件的链接 (drive.google.com/file/d/1MFS1-CKA1g6JiRcGiTQi1OpNl-j-bgBq/…)。只有几行是相关的:50-51 - lineOfFlight 的声明,114-117 - 在 Awake() 中添加 LineRenderer,以及 236-246 - 设置它。唯一的编译错误是 245“'LineRenderer' 不包含 'SetPositions' 的定义 ....”。感谢您的帮助。 顺便说一句,你可以简单地做lineOfFlight = new GameObject ("Line").AddComponent&lt;LineRenderer&gt;(); Debug.Log(lineOfFlight); 【参考方案1】:

您问题中的代码对我来说是开箱即用的,因此它几乎肯定与使用相同 LineRenderer 名称的另一个库或包发生冲突。

可能定义您要使用来自UnityEngine 命名空间的LineRenderer 应该可以解决您的问题。 (除了把别的包去掉,但你说找不到)

using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour

    UnityEngine.LineRenderer lineOfFlight;// <- Note the UnityEngine.Linerenderer
    void Awake()
    
        GameObject lineObject = new GameObject("Line");

        lineOfFlight = lineObject.AddComponent<UnityEngine.LineRenderer>();// <- notice the UnityEngine.LineRenderer
    

    // Update is called once per frame
    void Update()
    
        List<Vector3> savedBuffer = new List<Vector3>();

        if (Input.GetKey(KeyCode.V))
        
            if (true)
            
                Vector3[] positions = new Vector3[30];
                int index = 0;

                foreach (Vector3 m in savedBuffer)
                    positions[index++] = new Vector3(index, index, index);

                lineOfFlight.SetPositions(positions);
            
        
    

通常这样的问题应该伴随着IDE抛出一个错误

错误 CS0104:“LineRenderer”是“SomePackage.LindeRenderer”和“UnityEngine.LineRenderer”之间的模糊引用

【讨论】:

感谢您在这方面的帮助 - 就是这样。将所有内容定义为 UnityEngine.LineRenderer 解决了它。我认为这可能是通过安装 Unity.UI.Extensions 包来实现的 - 我从那时开始遇到了其他类似的问题,尽管他们确实说他们的一切都在他们自己的命名空间中。我以为我已经设法将其全部删除,但也许没有。 @nmw01223 只是出于好奇,您的 IDE 是否没有抛出像 error CS0104: 'LineRenderer' is an ambiguous reference between 'SomePackage.LindeRenderer' and 'UnityEngine.LineRenderer' (或类似的东西)这样的错误?通常他们应该能够理解这一点。 不是 100% 确定,但肯定不记得看过。【参考方案2】:

您可能能够解决问题,但添加以下内容:

if(lineOfFlight == null)

     GameObject lineObject = new GameObject("Line");
     lineOfFlight = lineObject.AddComponent<LineRenderer>();

就在下面

if (recording.savedBuffer != null)
    

确保在被 Update() 脚本调用之前正确设置 lineOfFlight。如果这解决了您的问题,则存在竞争条件导致在触发 Awake() 之前为对象触发 Update()

【讨论】:

谢谢,但没有帮助,恐怕。这是一个编译时问题,所以我认为不会出现运行时竞争条件。此外,添加一个新组件是一个昂贵的过程——不会真的想在 Update() 中这样做。还是谢谢。 啊,我错过了这是一个编译时问题,而不是运行时问题。【参考方案3】:

在设置位置之前尝试分配点数

lineRenderer.positionCount = list.Count;
lineRenderer.SetPositions(list);

【讨论】:

感谢它实际上是对不同对象的模棱两可的引用。

以上是关于Unity LineRenderer - 无法设置位置的主要内容,如果未能解决你的问题,请参考以下文章

Unity之LineRenderer组件

<转载>Unity3D中LineRenderer的使用

unity利用LineRenderer在两点之间生成抛物线

游戏开发解答教你在Unity中使用LineRenderer制作行军蚂蚁线(行军 | 虚线 | 路径 | 线段)

游戏开发解答教你在Unity中使用LineRenderer制作行军蚂蚁线(行军 | 虚线 | 路径 | 线段)

游戏开发实战Unity实现类似GitHub地球射线的效果(LineRenderer | 贝塞尔曲线)