C# 从另一个非单行为类访问变量
嗨,我想从Unity中的另一个类中获取一个变量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
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变量。