Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个非单行为类访问变量_C#_Unity3d - Fatal编程技术网

C# 从另一个非单行为类访问变量

C# 从另一个非单行为类访问变量,c#,unity3d,C#,Unity3d,嗨,我想从Unity中的另一个类中获取一个变量 public class CameraMove : MonoBehaviour { public GameObject lookTarget; public GameObject MainCamera; public GameObject nextMovePoint; private int currentPoint = 0; [System.Serializable] public clas

嗨,我想从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));
    }
我想从类路径中获取移动点,但是GetComponent给了我一个错误?我如何得到那个变量


仍然在努力解决这个问题,有人有了主意吗?

从您的代码中,我看到您的Path类是CameraMove类的innerlocal类。所以我想你们应该将它移动到单独的类读取文件中,并将其作为组件附加到你们需要的任何游戏对象上。因此,您可以在该对象上使用getComponent。然而,若您希望Path类是内部类,那个么您需要像Startit一样初始化

Path[0]=new Path(); //etc
然后您可以在CameraMove类中使用它作为

Path[0].movePoints[currentPoint];

但是,如果您进一步解释您想要实现的目标,那么我可以提供更准确的解决方案。

从您的代码中,我看到您的Path类是CameraMove类的innerlocal类。所以我想你们应该将它移动到单独的类读取文件中,并将其作为组件附加到你们需要的任何游戏对象上。因此,您可以在该对象上使用getComponent。然而,若您希望Path类是内部类,那个么您需要像Startit一样初始化

Path[0]=new Path(); //etc
然后您可以在CameraMove类中使用它作为

Path[0].movePoints[currentPoint];
但是如果你能解释更多你想要实现的目标,那么我可以提供更准确的解决方案。

GetComponent的主要目标是让一个组件连接到游戏对象。这意味着GetComponent只能获取从UnityEngine.Component派生的类的对象。注意,MonoBehavior是组件的一个子类,所以任何和所有MonoBehavior子类都是组件的子类。还要注意的是,只有组件(即派生组件的类)显示在游戏对象的检查器中

类路径不直接或间接继承类组件。因此,无法使用GetComponent将其添加到对象或从对象检索

正如您在注释中指定的,CameraMove.Path类型的对象位于CameraMove类型的另一个组件中。如果另一个CameraMove组件位于另一个游戏对象上,事情就会变得非常简单。您甚至不需要GetComponent来完成此操作。只需创建一个字段public CameraMove otherCameraMove我更喜欢带有SerializeField属性的私有字段,但这并不重要,因为您显然是Unity的新手,并在inspector中选择了另一个CameraMove对象。您将能够以otherCameraMove.Path访问paths变量

但是,如果另一个CameraMove组件位于同一对象上,事情会变得更加棘手。一、 例如,建议游戏对象永远不要,永远不要有同一组件的多个实例。但是如果您这样做了,您必须使用GetComponents来检索游戏对象上CameraMove类型的所有组件,并在数组中迭代查找所需的CameraMove组件。这只是我认为相同组件不应多次添加到同一对象的原因之一。

GetComponent的主要目标是将组件附加到游戏对象。这意味着GetComponent只能获取从UnityEngine.Component派生的类的对象。注意,MonoBehavior是组件的一个子类,所以任何和所有MonoBehavior子类都是组件的子类。还要注意的是,只有组件(即派生组件的类)显示在游戏对象的检查器中

类路径不直接或间接继承类组件。因此,无法使用GetComponent将其添加到对象或从对象检索

正如您在注释中指定的,CameraMove.Path类型的对象位于CameraMove类型的另一个组件中。如果另一个CameraMove组件位于另一个游戏对象上,事情就会变得非常简单。您甚至不需要GetComponent来完成此操作。只需创建一个字段public CameraMove otherCameraMove我更喜欢带有SerializeField属性的私有字段,但这并不重要,因为您显然是Unity的新手,并在inspector中选择了另一个CameraMove对象。您将能够以otherCameraMove.Path访问paths变量

但是,如果另一个CameraMove组件位于同一对象上,事情会变得更加棘手。一、 例如,建议游戏对象永远不要,永远不要有同一组件的多个实例。但是如果您这样做了,您必须使用GetComponents来检索游戏对象上CameraMove类型的所有组件,并在数组中迭代查找所需的CameraMove组件。这只是我认为同一组件不应多次添加到同一对象的原因之一。

您不需要使用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;
}
据我所知,您希望在更新事件中使用您的路径。因为路径只是组件上的一个常规变量,比如Lo okTarget或MainCamera,您可以直接参考它。因此:

void Update() {
    Path path = Paths[/*some index*/];
    Debug.Log(path.MovePoints[_currentPoint]);
    // etc.
}
GetComponent用于获取附加到游戏对象的不同MonoBehavior。当它是序列化信息的一部分时,它已经在您的类中,您可以直接使用它。

您不需要使用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;
}
据我所知,您希望在更新事件中使用您的路径。因为路径只是组件上的一个常规变量,如LookTarget或MainCamera,所以您可以直接引用它。因此:

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


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

附加CameraMove的游戏对象是否也有路径?GetComponent获取组件在本例中,是来自所选游戏对象的脚本。如果它来自另一个游戏对象,你需要首先找到该游戏对象,然后从该游戏对象中获取组件并查看变量。GameObject.FindObject,路径为.GetComponent;。但是,您不应该在Update方法中执行此操作,因为它会运行每一帧,并且您只需要执行一次,对吗?在Start方法中执行此操作,并将Paths变量另存为要使用的类变量。未附加Paths。我该怎么做?它不在inspector中,而是在附加到对象的另一个脚本中。然后在另一个脚本上获取组件,然后通过该脚本(如果该脚本将其作为变量)。路径路径=GetComponent.pathsVariable;如果另一个脚本位于另一个游戏对象上,则必须首先获取该游戏对象。不能从另一个脚本执行“路径=”。此外,我没有另一个脚本,我只想在一个脚本中从名为“CameraMove”的类中的名为“Path”的类中移动点。不要在问题中的任何地方都写C,而应该像在unity3d中那样将C放在标记部分。我意识到这个问题有些不同,所以我重新打开它,并更改了标题以匹配您正在做的事情。你还在为此挣扎吗?连接了CameraMove的游戏对象也有路径吗?GetComponent获取组件在本例中,是来自所选游戏对象的脚本。如果它来自另一个游戏对象,你需要首先找到该游戏对象,然后从该游戏对象中获取组件并查看变量。GameObject.FindObject,路径为.GetComponent;。但是,您不应该在Update方法中执行此操作,因为它会运行每一帧,并且您只需要执行一次,对吗?在Start方法中执行此操作,并将Paths变量另存为要使用的类变量。未附加Paths。我该怎么做?它不在inspector中,而是在附加到对象的另一个脚本中。然后在另一个脚本上获取组件,然后通过该脚本(如果该脚本将其作为变量)。路径路径=GetComponent.pathsVariable;如果另一个脚本位于另一个游戏对象上,则必须首先获取该游戏对象。不能从另一个脚本执行“路径=”。此外,我没有另一个脚本,我只想在一个脚本中从名为“CameraMove”的类中的名为“Path”的类中移动点。不要在问题中的任何地方都写C,而应该像在unity3d中那样将C放在标记部分。我意识到这个问题有些不同,所以我重新打开它,并更改了标题以匹配您正在做的事情。你还在为此挣扎吗?并将其作为组件连接到你需要的任何游戏对象上。我该怎么做?这不是单一行为。好吧,你可以让它成为单一行为。我看不出有什么理由不能这样。或者您可以将其用作“但是,如果您希望路径类是内部类,那么您需要在Startit中初始化,比如路径[0]=新路径//etc,然后可以在CameraMove类中作为路径[0]使用它但你真正想要实现什么呢?你的意图是什么?您将如何处理该路径?您最好使用navMesh和自动导航,然后实现自己的?好的,从头开始。我想知道我如何用它来调整特定航路点之间的时间/速度。我在Unity论坛上问过:,但我不耐烦了,在这里问了我的问题。所以我有一个问题,从这个问题我得到了另一个问题。。。也许你读了会更明白。为什么我做不到呢?因为如果它不是一个单一行为,它在inspector中看起来是这样的:,我想要的。如果我真的让它成为一个单一行为,它在inspector中看起来是这样的:并将其作为组件附加到您需要的任何游戏对象上。我该怎么做?这不是单一行为。好吧,你可以让它成为单一行为。我看不出有什么理由不能这样。或者您也可以将其用作“但是,如果您希望路径类是内部类”
o您需要在Startit-like路径[0]=新路径中启动//etc,然后可以在CameraMove类中作为路径[0]使用它但你真正想要实现什么呢?你的意图是什么?您将如何处理该路径?您最好使用navMesh和自动导航,然后实现自己的?好的,从头开始。我想知道我如何用它来调整特定航路点之间的时间/速度。我在Unity论坛上问过:,但我不耐烦了,在这里问了我的问题。所以我有一个问题,从这个问题我得到了另一个问题。。。也许你读了会更明白。为什么我做不到呢?因为如果它不是一个单一行为,它在inspector中看起来是这样的:,我想要的。如果我真的让它成为一个单一行为,它在检查员中看起来是这样的:谢谢你的解释。我这样做了,就像你说的,我能够访问其他CameraMove.Path。但是这个变量在CameraMove类中,我需要Paths类中的movePoints变量。谢谢您的解释。我这样做了,就像你说的,我能够访问其他CameraMove.Path。但是这个变量在CameraMove类中,我需要Paths类中的movePoints变量。