【问题标题】:Vector 3 array ,how to assign positions to Vector3 arrayVector 3 数组,如何将位置分配给 Vector3 数组
【发布时间】:2019-07-25 15:02:27
【问题描述】:

我们试图将位置放入 Vector3 数组中,方法是将它们的位置放入另一个向量中,并将其作为索引放入 Vector3 数组中。我们正在尝试制作一款棋盘游戏,我们希望将玩家移动到 Vector3 数组的某个位置。

public static Vector3[] Steps;

public static void Position()
{
    Vector3 step = GameObject.Find("Step").transform.position;

    Steps[0] = step;

    Vector3 step1 = GameObject.Find("Step (1)").transform.position;
    Steps[1] = step1;

等等

【问题讨论】:

  • 你有什么问题?
  • 我如何将 Vector3 位置输入到数组中,像这样它不会输入数组中的 x、y、z 位置。我无法调用数组的索引将其移动到那里。

标签: c# unity3d


【解决方案1】:

在将值分配给数组之前,您必须将其初始化为一个大小,例如

public static Vector3[] Steps;

public static void Position()
{
    Steps = new Vector3[someSize];

    Vector3 step = GameObject.Find("Step").transform.position;

    Steps[0] = step;

    Vector3 step1 = GameObject.Find("Step (1)").transform.position;
    Steps[1] = step1;
}

someSize 当然必须与您要添加的职位数量相匹配。

或者更确切地说,使用类似的列表动态地进行

public static List<Vector3> Steps = new List<Vector3>();

public static void Position()
{
    // optionally remove current values first
    Steps.Clear();

    Steps = new Vector3[someSize];

    Vector3 step = GameObject.Find("Step").transform.position;

    Steps.Add(step);

    Vector3 step1 = GameObject.Find("Step (1)").transform.position;
    Steps.Add(step1);
}

您以后访问的方式完全相同

Steps[index]

如果您已经可以事先在场景中引用您的游戏对象,您应该做类似的事情会更容易

[SerializeField] private List<Transform> _steps = new List<Transform>();

并通过 Unity 中的检查器简单地引用此列表中的所有游戏对象。这样,您甚至不需要直接获取职位,而是可以简单地发布此列表,例如

[SerializeField] private List<Transform> _steps = new List<Transform>();

public static List<Transform> Steps;

private void Awake()
{
    Steps = _steps;
}

并像访问它们一样

Steps[index].position

【讨论】:

    【解决方案2】:

    你可以使用多数组:

    List<List<Vector3>> Positions;
    

    然后你会有一个“二维板”,位置看起来像这样:

    Positions[1][4];
    

    另外,你的问题有点令人困惑,很难理解你真正想要什么。

    【讨论】:

      【解决方案3】:

      好吧,根据您提出的问题,我猜您对 Unity 有点陌生,对吧?所以我会更详细地讨论这个。

      我要解决的第一件事是创建类的实例,而不是静态的。 (实例之一是您可以拖放到游戏对象上的脚本)这样做是为了您可以更轻松地引用所有对象并实际使对象的交互起作用。 (如果你想了解更多关于这个用途的信息,我可以向你推荐这个视频:https://www.youtube.com/watch?v=Rgvq8MUtfTo

      下一个错误是你没有初始化 zhe 数组。面向对象的数组比其他语言(比如 Python)要复杂一些。在这里,您需要在初始化数组时显式设置数组的内容,或者至少定义其长度。这是您以后无法更改的内容。如果您希望采用更动态的方法来存储 C# 的变量,我会看看 Lists。 (如果您不确定到底有什么不同,请查看此内容:https://www.educba.com/c-sharp-array-vs-list/

      如果您习惯这样做,最后一件非常糟糕的事情是使用 find 方法获取对游戏对象的引用。虽然它确实有效,而且我猜你的例子很快,但一旦你用游戏对象填充你的场景,它就会停止。最好在开始时将 refs 拖到对象上,或者如果您在运行时实例化对象,那么您可以跟踪。

      所以总体而言,假设您拥有场景中的所有对象,我会这样解决您的问题:

      using UnityEngine;
      
      public class GameManager : MonoBehaviour
      {
          public GameObject[] figures;
      
          void Start(){
              foreach(GameObject figure in figures){
                  //this is where you get all of their positions
                  Debug.log(figure.transform.position)
              }
          }
      
      }
      

      请记住,您必须在开始之前将图形分配给组件变量。你可以在这里阅读更多信息:https://docs.unity3d.com/Manual/VariablesAndTheInspector.html

      希望这对您的游戏有所帮助!

      【讨论】:

        猜你喜欢
        • 2019-10-01
        • 2011-08-15
        • 2018-05-17
        • 1970-01-01
        • 2014-11-23
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        相关资源
        最近更新 更多