Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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#_Arrays_Object_Unity3d - Fatal编程技术网

C# 如何使用动态索引更新对象数组? 开始

C# 如何使用动态索引更新对象数组? 开始,c#,arrays,object,unity3d,C#,Arrays,Object,Unity3d,ex“调整数组大小的丢失类或索引” 我正在构建一个保存值的对象​​我的车 基本逻辑是: 对于每个齿轮箱>保存每个悬架>保存每个车轮 脚本的逻辑: public class VehicleController : MonoBehaviour { public gearbox[] gearboxes = new gearbox[0]; //999 not change effect [System.Serializable] public class

ex“调整数组大小的丢失类或索引”

我正在构建一个保存值的对象​​我的车

基本逻辑是: 对于每个齿轮箱>保存每个悬架>保存每个车轮

脚本的逻辑:

  public class VehicleController : MonoBehaviour
  {
      public gearbox[] gearboxes = new gearbox[0]; //999 not change effect

      [System.Serializable] 
      public class gearbox
      {
        public Transform gearBoxTarget;

        public List<Transform> assets = new List<Transform>();

        public gearbox(Transform gearBoxTarget, List<Transform> assets  )
        {
            this.gearBoxTarget = gearBoxTarget;
            this.assets = assets;
        }
      }

      void Awake()
      {
        /// count all gBox into 3d model
        List<Transform> boxes = new List<Transform>();
        Transform[] elems = transform.GetComponentsInChildren<Transform>();
        int Index = 0;
        for (int c = 0; c < elems.Length; c++)
        {
          if (elems[c].name == "gearbox")
          {
            Index++;
            boxes.Add(elems[c].transform);
          }
        }

        /// set array length (1 for gBox finded)
        System.Array.Resize(ref gearboxes, Index);

        /// for all gearboxes finded (or boxes.Length... It's equal)
        for (int box = 0; box < gearboxes.Length; box++)
        {
          // get suspansions and wheels
          Transform[] inBox = boxes[box].GetComponentsInChildren<Transform>();
          List <Transform> Items = new List <Transform>();
          for (int e = 0; e < inBox.Length; e++)
          {
              var el = inBox[e];
              if (el.parent.name == "gearbox" || el.name == "wheel"){ Debug.Log(e+" => "+el); Items.Add(el); }else{Debug.Log(e);}
              if(e==inBox.Length) { Debug.Log("finder end"); }
          }

          /// add elements into the gearbox object
          Debug.Log(gearboxes[box]); // NULL!
          gearboxes[box].gearBoxTarget = boxes[box]; // NULL!
          gearboxes[box].assets.AddRange(Items); // NULL!
        }
      }
  }

测试03.c-解决方案 正如建议的那样,它是“实例化对象”,但是这是直接实例化到列表的构造中的

如果没有这一点,最大的问题是要理解“如果对象为空,则不可能即时处理对象”,否则您将发现著名的“空错误”

所以。。。让我们给它一个空值!:这是解决方案

public class VehicleController : MonoBehaviour
{
    [SerializeField]        public List<boxvalues> gearboxes = new List<boxvalues>();
    [System.Serializable]   public class boxvalues
                            {
                              public Transform boxTarget;
                              public boxvalues(Transform boxTarget)
                              {
                                this.boxTarget = boxTarget;
                              }
                              // [SerializeField] public Transform boxTarget { get; set; } // This is a safer system but does not expose variables.
                            }
  

    void Awake()
    {


      /// count all gBox into 3d model
      List<Transform> boxes = new List<Transform>();                       // prepare a list of gameObject.
      Transform[] elms = transform.GetComponentsInChildren<Transform>();   // find all child into main gameObject.
      int Counted = 0;                                                     // Counter of gameObject
      for (int c = 0; c < elms.Length; c++)                                // Loop all finded gameObject into main
      {
        if (elms[c].name == "gearbox")                                     // if is my gameObject...
        { Counted++; boxes.Add(elms[c].transform); }                       // add it to list and count it...
      }

      Debug.Log(boxes.Count);                                              // yes, It's 3 gameObject.

      /// add class on link (1 for all gBox finded)
      for (int box = 0; box < boxes.Count; box++) 
      {
        gearboxes.Add( new VehicleController.boxvalues(null));            // now for all gameObject init a new data container... empty (yooo! new list of data!)
      }

      // for all gearboxes in list
      for (int i = 0; i < gearboxes.Count; i++)                           // now for all data container... put a new values. Win!
      {
        /// add elements into the box object
        gearboxes[i].boxTarget = boxes[i];
      }

      // test return the values
      for (int i = 0; i < gearboxes.Count; i++)
      {
        Debug.Log("++ "+gearboxes[i].boxTarget);
      }

    }
}
公共级车辆控制器:单行为
{
[SerializeField]公共列表齿轮箱=新列表();
[System.Serializable]公共类值
{
公共目标;
public boxvalues(转换boxTarget)
{
this.boxTarget=boxTarget;
}
//[SerializeField]public Transform boxTarget{get;set;}//这是一个更安全的系统,但不公开变量。
}
无效唤醒()
{
///将所有gBox计算到三维模型中
列表框=新建列表();//准备游戏对象列表。
Transform[]elms=Transform.GetComponentsInChildren();//将所有子项查找到主游戏对象中。
int Counted=0;//游戏对象的计数器
for(int c=0;c
我真诚地感谢那些有耐心给我提供有用指导的人


我希望这个方案在教学上对其他人有用。

您需要创建类实例:

public class VehicleController : MonoBehaviour
  {
      public gearbox[] gearboxes = null;

      public VehicleController()
      {
        gearboxes = new gearbox[0];
      }

      [System.Serializable] 
      public class gearbox
      {
        public Transform gearBoxTarget;

        public List<Transform> assets = new List<Transform>();

        public gearbox(Transform gearBoxTarget, List<Transform> assets  )
        {
            this.gearBoxTarget = gearBoxTarget;
            this.assets = assets;
        }
      }

      void Awake()
      {
        /// count all gBox into 3d model
        List<Transform> boxes = new List<Transform>();
        Transform[] elems = transform.GetComponentsInChildren<Transform>();
        int Index = 0;
        for (int c = 0; c < elems.Length; c++)
        {
          if (elems[c].name == "gearbox")
          {
            Index++;
            boxes.Add(elems[c].transform);
          }
        }

        /// set array length (1 for gBox finded)
        System.Array.Resize(ref gearboxes, Index);

        /// for all gearboxes finded (or boxes.Length... It's equal)
        for (int box = 0; box < gearboxes.Length; box++)
        {
          // get suspansions and wheels
          Transform[] inBox = boxes[box].GetComponentsInChildren<Transform>();
          List <Transform> Items = new List <Transform>();
          for (int e = 0; e < inBox.Length; e++)
          {
              var el = inBox[e];
              if (el.parent.name == "gearbox" || el.name == "wheel"){ Debug.Log(e+" => "+el); Items.Add(el); }else{Debug.Log(e);}
              if(e==inBox.Length) { Debug.Log("finder end"); }
          }

          /// add elements into the gearbox object
          Debug.Log(gearboxes[box]);
          gearboxes[box].gearBoxTarget = boxes[box];
          gearboxes[box].assets.AddRange(Items);
        }
      }
  }
公共级车辆控制器:单行为
{
公共齿轮箱[]齿轮箱=空;
公共车辆控制器()
{
齿轮箱=新齿轮箱[0];
}
[系统可序列化]
公共级变速箱
{
公共转型目标;
公共列表资产=新列表();
公共齿轮箱(转换齿轮箱目标,列出资产)
{
this.gearBoxTarget=gearBoxTarget;
这是资产=资产;
}
}
无效唤醒()
{
///将所有gBox计算到三维模型中
列表框=新列表();
Transform[]elems=Transform.GetComponentsInChildren();
int指数=0;
for(int c=0;c”+el);Items.Add(el);}否则{Debug.Log(e);}
如果(e==inBox.Length){Debug.Log(“finder end”);}
}
///将元素添加到齿轮箱对象中
调试日志(齿轮箱[box]);
变速箱[box].gearBoxTarget=box[box];
变速箱[box].assets.AddRange(项目);
}
}
}
我猜您没有添加的函数一定是这样的:

public class Transform
    {

        public string name { get; set; }

        public Transform parent { get; set; }

        public Transform[] GetComponentsInChildren<T>()
        {
            return (new List<Transform>() {
                new Transform() { name = "gearbox" },
                new Transform() { parent = new Transform() { name = "gearbox" }, name = "wheel" }
            }).ToArray();
        }
    }
公共类转换
{
公共字符串名称{get;set;}
公共转换父项{get;set;}
公共转换[]GetComponentsInChildren()的
{
返回(新列表(){
新建转换(){name=“齿轮箱”},
新变换(){parent=new Transform(){name=“gearbox”},name=“wheel”}
}).ToArray();
}
}
假设是这种情况,它的逻辑是相同的,您必须初始化变量,因为您初始化了类,否则它将始终为null

public class VehicleController
    {
        private gearbox[] gearboxes;
        private readonly Transform transform;

        public VehicleController(Transform _transform)
        {
            gearboxes = new gearbox[0];
            transform = _transform;
        }

        [System.Serializable]
        public class gearbox
        {
            public Transform gearBoxTarget;

            public List<Transform> assets = new List<Transform>();

            public gearbox(Transform gearBoxTarget, List<Transform> assets)
            {
                this.gearBoxTarget = gearBoxTarget;
                this.assets = assets;
            }
        }

        void Awake()
        {
            /// count all gBox into 3d model
            List<Transform> boxes = new List<Transform>();
            Transform[] elems = transform.GetComponentsInChildren<Transform>();
            int Index = 0;
            for (int c = 0; c < elems.Length; c++)
            {
                if (elems[c].name == "gearbox")
                {
                    Index++;
                    boxes.Add(elems[c].transform);
                }
            }

            /// set array length (1 for gBox finded)
            System.Array.Resize(ref gearboxes, Index);

            /// for all gearboxes finded (or boxes.Length... It's equal)
            for (int box = 0; box < gearboxes.Length; box++)
            {
                // get suspansions and wheels
                Transform[] inBox = boxes[box].GetComponentsInChildren<Transform>();
                List<Transform> Items = new List<Transform>();
                for (int e = 0; e < inBox.Length; e++)
                {
                    var el = inBox[e];
                    if (el.parent.name == "gearbox" || el.name == "wheel") { Debug.Log(e + " => " + el); Items.Add(el); } else { Debug.Log(e); }
                    if (e == inBox.Length) { Debug.Log("finder end"); }
                }

                /// add elements into the gearbox object
                Debug.Log(gearboxes[box]);
                gearboxes[box].gearBoxTarget = boxes[box];
                gearboxes[box].assets.AddRange(Items);
            }
        }
    }
公共级车辆控制器
{
私人变速箱【】变速箱;
私有只读转换;
公共车辆控制器(转换)
{
齿轮箱=新齿轮箱[0];
变换=_变换;
}
[系统可序列化]
公共级变速箱
{
公共转型目标;
公共列表资产=新列表();
公共齿轮箱(转换齿轮箱目标,列出资产)
{
这是gearBo先生
public class VehicleController : MonoBehaviour
  {
      public gearbox[] gearboxes = null;

      public VehicleController()
      {
        gearboxes = new gearbox[0];
      }

      [System.Serializable] 
      public class gearbox
      {
        public Transform gearBoxTarget;

        public List<Transform> assets = new List<Transform>();

        public gearbox(Transform gearBoxTarget, List<Transform> assets  )
        {
            this.gearBoxTarget = gearBoxTarget;
            this.assets = assets;
        }
      }

      void Awake()
      {
        /// count all gBox into 3d model
        List<Transform> boxes = new List<Transform>();
        Transform[] elems = transform.GetComponentsInChildren<Transform>();
        int Index = 0;
        for (int c = 0; c < elems.Length; c++)
        {
          if (elems[c].name == "gearbox")
          {
            Index++;
            boxes.Add(elems[c].transform);
          }
        }

        /// set array length (1 for gBox finded)
        System.Array.Resize(ref gearboxes, Index);

        /// for all gearboxes finded (or boxes.Length... It's equal)
        for (int box = 0; box < gearboxes.Length; box++)
        {
          // get suspansions and wheels
          Transform[] inBox = boxes[box].GetComponentsInChildren<Transform>();
          List <Transform> Items = new List <Transform>();
          for (int e = 0; e < inBox.Length; e++)
          {
              var el = inBox[e];
              if (el.parent.name == "gearbox" || el.name == "wheel"){ Debug.Log(e+" => "+el); Items.Add(el); }else{Debug.Log(e);}
              if(e==inBox.Length) { Debug.Log("finder end"); }
          }

          /// add elements into the gearbox object
          Debug.Log(gearboxes[box]);
          gearboxes[box].gearBoxTarget = boxes[box];
          gearboxes[box].assets.AddRange(Items);
        }
      }
  }
public class Transform
    {

        public string name { get; set; }

        public Transform parent { get; set; }

        public Transform[] GetComponentsInChildren<T>()
        {
            return (new List<Transform>() {
                new Transform() { name = "gearbox" },
                new Transform() { parent = new Transform() { name = "gearbox" }, name = "wheel" }
            }).ToArray();
        }
    }
public class VehicleController
    {
        private gearbox[] gearboxes;
        private readonly Transform transform;

        public VehicleController(Transform _transform)
        {
            gearboxes = new gearbox[0];
            transform = _transform;
        }

        [System.Serializable]
        public class gearbox
        {
            public Transform gearBoxTarget;

            public List<Transform> assets = new List<Transform>();

            public gearbox(Transform gearBoxTarget, List<Transform> assets)
            {
                this.gearBoxTarget = gearBoxTarget;
                this.assets = assets;
            }
        }

        void Awake()
        {
            /// count all gBox into 3d model
            List<Transform> boxes = new List<Transform>();
            Transform[] elems = transform.GetComponentsInChildren<Transform>();
            int Index = 0;
            for (int c = 0; c < elems.Length; c++)
            {
                if (elems[c].name == "gearbox")
                {
                    Index++;
                    boxes.Add(elems[c].transform);
                }
            }

            /// set array length (1 for gBox finded)
            System.Array.Resize(ref gearboxes, Index);

            /// for all gearboxes finded (or boxes.Length... It's equal)
            for (int box = 0; box < gearboxes.Length; box++)
            {
                // get suspansions and wheels
                Transform[] inBox = boxes[box].GetComponentsInChildren<Transform>();
                List<Transform> Items = new List<Transform>();
                for (int e = 0; e < inBox.Length; e++)
                {
                    var el = inBox[e];
                    if (el.parent.name == "gearbox" || el.name == "wheel") { Debug.Log(e + " => " + el); Items.Add(el); } else { Debug.Log(e); }
                    if (e == inBox.Length) { Debug.Log("finder end"); }
                }

                /// add elements into the gearbox object
                Debug.Log(gearboxes[box]);
                gearboxes[box].gearBoxTarget = boxes[box];
                gearboxes[box].assets.AddRange(Items);
            }
        }
    }