【问题标题】:Having trouble with GameObject lists in C# for unity在 C# 中使用 GameObject 列表时遇到问题以实现统一
【发布时间】:2021-01-07 00:00:47
【问题描述】:

我正在做一个应该是相对简单的脚本练习,但我是 Unity 脚本的新手,并且已经坚持了太久。

基本上,我正在处理的参数如下:

  1. 在场景中的每一帧实例化一个立方体预制件。
  2. 立方体需要根据生成的顺序命名为“Cube1”、“Cube2”……。
  3. 立方体需要在距离原点 [0,0,0] 1 个单位内的随机位置生成。
  4. 每个立方体都应该有一个随机的颜色。
  5. 立方体大小 (localScale) 在每帧中缩小 10%。
  6. 当立方体的比例小于其原始比例的 10% 时,立方体被销毁。

我被困在第二部分。我可以创建任意数量的立方体对象,但我试图在列表中命名它们只会在每次创建新对象时显示为“立方体”。

另外,我不确定如何定位列表中的每个立方体,以便它们全部缩小然后消失。所以就目前而言,这只是在距离原点 1 个单位内生成随机大小和颜色的立方体,但这些立方体一旦被创建就不会做任何事情。

到目前为止我的代码:

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeCreator : MonoBehaviour
{
    Vector3 origin;
    private List<GameObject> cubeList;
    public float targetScale = 0.1f;
    public float shrinkSpeed = 0.1f;
// Start is called before the first frame update




private void Awake()
{
    cubeList = new List<GameObject>();
}

void Start()
{
    origin = new Vector3(0, 0, 0);

}

// Update is called once per frame
void Update()
{
    AddNewCube();
   
    // RemoveCube(cubeList[i]);
    //i++;


}

private void SetRandCubeState(GameObject cube)
{

    float randScale = Random.Range(0.8f, 1.0f);
    Vector3 randomScaler = new Vector3(randScale, randScale, randScale);
    cube.transform.localScale = randomScaler;
    Vector3 randomPosition = new Vector3(Random.Range(origin.x - 1.0f, origin.x + 1.0f), Random.Range(origin.y - 1.0f, origin.y + 1.0f), Random.Range(-1.0f,1.0f));
    cube.transform.localPosition = randomPosition;
    Renderer render = cube.GetComponent<Renderer>();
    render.material.SetColor("_Color", Random.ColorHSV());

}

private void AddNewCube()
{
    GameObject newCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cubeList.Add(newCube);
    SetRandCubeState(newCube);
    for (int i = 0; i == cubeList.Count; i++)
    {
        cubeList[i].name = "cube" + i;
        cubeList[i].transform.localScale = Vector3.Lerp(cubeList[i].transform.localScale, new Vector3(targetScale, targetScale, targetScale), Time.deltaTime * shrinkSpeed);
        print("i is equal to " + i);
    }


}

private void RemoveCube(GameObject oldCube)
{
    Destroy(oldCube);

}

}

【问题讨论】:

    标签: c# visual-studio unity3d scripting


    【解决方案1】:

    你放的错误==所以永远不会执行。

    for (int i = 0; i < cubeList.Count; i++)
        {
            cubeList[i].name = "cube" + i;
            cubeList[i].transform.localScale = Vector3.Lerp(cubeList[i].transform.localScale, new Vector3(targetScale, targetScale, targetScale), Time.deltaTime * shrinkSpeed);
            print("i is equal to " + i);
        }
    

    【讨论】:

    • 当你销毁一个多维数据集时,一定要先从列表中删除。 if not 将在销毁多维数据集后运行 for 循环时抛出异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多