C# 如何使用动态索引更新对象数组? 开始
ex“调整数组大小的丢失类或索引” 我正在构建一个保存值的对象我的车 基本逻辑是: 对于每个齿轮箱>保存每个悬架>保存每个车轮 脚本的逻辑: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
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);
}
}
}