如何在 Unity 的 C# 中使用变量(字符串)给出的名称实例化类中的对象

本文关键字:对象 实例化 字符串 变量 Unity | 更新日期: 2023-09-27 18:36:53

这是我的类:

public class Mark {
    public GameObject InstanciatedObject;
    public Vector3 ControllerPosition;
    public Quaternion ControllerRotation;
    public void CreateMark(Mark m, GameObject o, Vector3 p, Quaternion r)
    {
        m.InstanciatedObject= o;
        m.ControllerPosition= p;
        m.ControllerRotation = r;
    }
}

我想在另一个脚本中使用以下行:

Mark m = new Mark();
m.CreateMark(m, ControllerObject, GetControllerPosition(), GetControllerRotation());

这里的问题是我不想手动创建对象的名称。例如,我想创建m1m2m3等。

如何在 Unity 的 C# 中使用变量(字符串)给出的名称实例化类中的对象

您不能在运行时创建变量名称,如果可能的话,这不是适合您的级别的基本情况。

最好是考虑一个数组:

MarksArray [] m = new MarksArray[size];
for(int i = 0; i < size ; i ++){
    m[i] = new Mark();
    m[i].CreateMark(param1, param2,...);
}

然后你可以像这样使用变量:

m[0].member = value;

作为旁注,您应该开始遵守 C# 编码约定,类和方法在前面使用 Cap 字母。

如果你这样做是为了让你有一些东西,比如相同类型的多个唯一对象的列表,比如屏幕上的多个敌人,你可以更好地使用以下方法:

public class Mark {
public GameObject InstantiatedGameObject;
public Vector3 ControllerPosition;
public Quaternion ControllerRotation;
public Mark(GameObject o, Vector3 p, Quaternion r)
{
    InstantiatedGameObject = o;
    ControllerPosition = p;
    ControllerRotation = r;
}

然后,您将使用以下代码:

using System.Collections.Generic;
public class Main {
   public List<Mark> MarkList = new List<Mark>()
   public void Main() {
      // do stuff to get the needed variables
      MarkList.Add(new Mark(ControllerObject, GetControllerPosition(), GetControllerRotation()));
   }
}

这会不断将 aMark 类对象的新的唯一实例添加到易于访问的列表中。 与使用数组相比,使用此方法的好处是无需提前确定最大大小,可以根据需要动态添加和删除对象。