【问题标题】:Access variable from another non MonoBehaviour class从另一个非 MonoBehaviour 类访问变量
【发布时间】:2017-04-09 05:11:04
【问题描述】:

您好,我想从 Unity 的另一个类中获取一个变量

public class CameraMove : MonoBehaviour {

    public GameObject lookTarget;
    public GameObject MainCamera;

    public GameObject nextMovePoint;

    private int currentPoint = 0;

    [System.Serializable]
    public class Paths
    {
        public float time;
        public Transform[] movePoints;


    }
    public Paths[] Path;




    void Update()
    {
        Paths paths = gameObject.GetComponent<Paths>();
        Debug.Log (paths.movePoints [currentPoint]);



        if (nextMovePoint.transform.position != paths.movePoints [currentPoint].position)
        {
            currentPoint += 1;
            nextMovePoint.transform.position = paths.movePoints [currentPoint].position;
        }
        iTween.MoveTo(nextMovePoint,iTween.Hash("time",paths.time));
    }

我想从类 Paths 中获取 movePoints,但 GetComponent 给我一个错误?我如何获得该变量?

还在为此苦苦挣扎,有人知道吗?

【问题讨论】:

  • 附有CameraMove的游戏对象是否也有Paths? GetComponent 从选定的游戏对象中获取组件(在本例中为脚本)。如果它来自另一个游戏对象,您需要先找到该游戏对象,然后从该对象执行 GetComponent 并查看变量。 GameObject.Find("Object with paths").GetComponent&lt;Paths&gt;();。但是,您不应该在 Update() 方法中执行此操作,因为它会运行每一帧,而您只需要执行一次,对吗?在Start() 方法中执行此操作,并将Paths 变量保存为要使用的类变量。
  • 路径未附加。我该怎么做?它不在检查器中,而是在附加到对象的另一个脚本中。
  • 然后 GetComponent 在另一个脚本上,然后通过那里获取它,如果该脚本将它作为变量。 Paths paths = GetComponent&lt;AnotherScript&gt;().pathsVariable; 如果AnotherScript 在另一个游戏对象上,您必须先获取该游戏对象。
  • 您不能从另一个脚本执行 'Paths paths ='。此外,我没有另一个脚本,我只想要 1 个脚本中名为“CameraMove”的类中名为“Paths”的类中的“movePoints”。
  • 不要在你的问题中到处写 C#,你应该把 C# 放在标签部分,就像你对 unity3d 所做的那样。我意识到这个问题有所不同,所以我重新打开它并更改了标题以匹配您正在做的事情。你还在为此苦恼吗?

标签: c# unity3d


【解决方案1】:

不需要使用GetComponent 来访问您的路径。

首先,我要稍微清理一下您的命名,以便我们谈论的内容更加清晰:

public class CameraMovement : MonoBehaviour {
    public GameObject LookTarget;
    public GameObject MainCamera;
    public GameObject NextMovePoint;
    public Path[] Paths;

    private int _currentPoint = 0;
}

[System.Serializable]
public class Path {
    public float Time;
    public Transform[] MovePoints;
}

据我了解,您想在您的 Update 事件中使用您的 Paths。因为Paths只是组件上的一个常规变量,比如LookTarget或者MainCamera,所以直接引用即可。因此:

void Update() {
    Path path = Paths[/*some index*/];
    Debug.Log(path.MovePoints[_currentPoint]);
    // etc.
}

GetComponent 用于获取附加到游戏对象的不同MonoBehaviour。当它是序列化信息的一部分时,它已经在你的类中,你可以直接使用它。

【讨论】:

    【解决方案2】:

    从您的代码中,我看到您的 Path 类是 CameraMove 类的内部(本地类)。所以我认为你想将它移动到单独的类(读取类似文件)并将其作为组件附加到你需要的任何游戏对象。那么你可以在那个对象上使用getComponent&lt;Path&gt;()。但是,如果您希望 Path 类成为内部类,那么您需要启动(在 Start() 中)它就像

    Path[0]=new Path(); //etc
    

    然后你可以在你的 CameraMove 类中使用它

    Path[0].movePoints[currentPoint];
    

    但如果你解释更多你想要达到的目标,那么我可以提供更准确的解决方案。

    【讨论】:

    • ''并将其作为组件附加到您需要的任何游戏对象上。'' 我该怎么做?这不是单一行为。
    • 好的,所以你可以让它成为 MonoBehaviour。我看不出有什么理由不能这样。或者您可以将其用作“但是,如果您希望 Path 类成为内部类,那么您需要像 Path[0]=new Path() 一样启动(在 Start() 中)它; //etc 然后你可以在你的 CameraMove 类中使用它作为 Path[0].movePoints[currentPoint];'
    • 但你真的想达到什么目标?你的意图是什么?你会用那条路做什么?你最好使用navMesh和自动导航,然后自己实现?
    • 好的,从头开始。我想知道如何使用 iTween 调整特定航点之间的时间/速度。我在Unity论坛上问过:forum.unity3d.com/threads/…,但我不耐烦了,在这里问我的问题。所以我有一个问题,从那个问题我得到了另一个问题(getcomponent thing..)。也许你读了它就会更好地理解它。
    • 为什么我不能让它成为 MonoBehaviour?因为如果它不是 MonoBehaviour,它在检查器中看起来像这样:i.gyazo.com/6750be4b8aa6f2b22209d97e29f34a4d.png,这是我想要的。如果我将它设为 MonoBehaviour,它在检查器中看起来像这样:i.gyazo.com/b424e19d31099d8af72e464931d510aa.png
    【解决方案3】:

    GetComponent 的主要目标是获得一个附加到游戏对象的组件。这意味着GetComponent 只能获取派生自 UnityEngine.Component 的类的对象。请注意MonoBehaviourComponent 的子类,因此任何和所有MonoBehaviour 子类都是Component 的子类。另请注意,只有组件,即派生 Component 的类会显示在游戏对象的检查器中。

    Paths直接或间接继承Component 类。因此,它不能添加到对象或使用GetComponent 从对象检索

    正如您在 cmets 中指定的,CameraMove.Paths 类型的对象位于 CameraMove 类型的另一个组件中。如果另一个CameraMove 组件位于另一个 游戏对象上,事情就会变得异常简单。你甚至不需要GetComponent。只需创建一个public CameraMove otherCameraMove 字段(我更喜欢带有SerializeField 属性的private 字段,但这并不重要,因为您显然是Unity 的新手)并在检查器中选择另一个CameraMove 对象。您将能够以otherCameraMove.Path 的身份访问路径变量。

    如果另一个CameraMove 组件位于same 对象上,那么事情就会变得更加棘手。一方面,我建议游戏对象应该永远、永远拥有多个相同组件的实例。但如果这样做,您将不得不使用GetComponents&lt;CameraMove&gt;() 来检索游戏对象上CameraMove 类型的所有 组件,并遍历数组以查找您想要的CameraMove 组件。这只是我认为不应将相同组件多次添加到同一个对象的原因之一。

    【讨论】:

    • 感谢您的解释。我这样做了,就像你说的那样,我能够访问 otherCameraMove.Path。但该变量在 CameraMove 类中,我需要 Paths 类中的 movePoints 变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2020-11-24
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多