从另一个非MonoBehaviour类访问变量

时间:2017-03-21 16:36:13

标签: c# unity3d

您好我想从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给我一个错误?我如何获得该变量?

仍在努力解决这个问题,任何人都有了想法?

3 个答案:

答案 0 :(得分:1)

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

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

然后您可以在CameraMove类中使用它作为

Path[0].movePoints[currentPoint];

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

答案 1 :(得分:1)

public class List { private ListNode myHead; private int mySize; public List() { this.myHead = null; this.mySize = 0; } public class ListNode { public String myData; public ListNode myNext; public ListNode(String element, ListNode next) { this.myData = element; this.myNext = next; } public ListNode(String element) { this(element, null); } public boolean isEmpty() { return this.length() == 0; } public void add(String s) { if(this.isEmpty() == true) { this.addToFront(s); } else { this.mySize++; for(ListNode node = this.myHead; node.myData != null; node = node.myNext) { if(node.myNext == null) { ListNode lno = new ListNode(s, null); node.myNext = lno; } else { node.myData = node.myData; } } } } 的主要目标是将组件附加到游戏对象上。这意味着GetComponent只能获取派生自 GetComponent的类的对象。请注意,UnityEngine.ComponentMonoBehaviour的子类,因此任何和所有Component子类都是MonoBehaviour的子类。另请注意,只有组件,即派生Component 的类显示在游戏对象的检查器中。

班级Component 直接或间接地继承班级Paths。因此,无法使用Component 添加到对象或从对象检索

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

如果另一个otherCameraMove.Path组件位于相同的对象上,那么事情变得更加棘手。举个例子,我建议游戏对象永远不会拥有同一个组件的多个实例。但是如果你这样做,你将不得不使用CameraMove来检索游戏对象上类型GetComponents<CameraMove>()所有组件,并遍历数组寻找{{ 1}}你想要的组件。这只是为什么在我看来同一个组件不应该多次添加到同一个对象的原因之一。

答案 2 :(得分: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;
}

据我了解,您希望在Paths事件中使用Update。由于Paths只是组件上的常规变量,例如LookTargetMainCamera,因此您可以直接引用它。因此:

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

GetComponent用于获取附加到游戏对象的其他MonoBehaviour。如果它是序列化信息的一部分,它已经在您的课程中,您可以直接使用它。