【问题标题】:Unity c# task, managing arraysunity c# 任务,管理数组
【发布时间】:2020-10-17 17:27:48
【问题描述】:

我刚刚开始学习新的硕士课程以提升我的职业生涯,我正在从头开始学习 c# 以进行 Unity 3D 游戏编程。 我得到了我的第一个每周任务,我很不知道我应该做什么。我被要求创建一个任何类型的数组,并通过一个开关能够从数组中添加一个元素或删除一个元素。我设法打印以记录我的初始数组,然后切换到添加大小写并向索引添加一个元素,但我遇到的问题是我只设法将一个元素添加到数组中。之后,我重新创建的辅助数组重置为每次返回添加案例时只添加一个。如果你能帮助我一些指针,那就太好了。

这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EjercicioSemanal_01 : MonoBehaviour
{
    public enum manageEnum {None, Add, Delete};
    public manageEnum enumValue;
    public int[] array = new int[5] {1, 2, 3, 4, 5};
    int[] newArray = new int[5];

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        switch (enumValue)
        {
            case manageEnum.None:
                if (newArray.Length > array.Length)
                {
                    for (int i = 0; i < newArray.Length; i++)
                    {
                        Debug.Log(newArray[i]);
                    }
                }
                else
                {
                    for (int j = 0; j < array.Length; j++)
                    {
                        Debug.Log(array[j]);
                    }
                }

                break;
            case manageEnum.Add:
                int itemToAdd = 0;
                newArray = new int[array.Length + 1];
                for (int i = 0; i < array.Length; i++)
                {
                    newArray[i] = array[i];
                }
                for (int j = 0; j < newArray.Length; j++)
                {
                    Debug.Log(newArray[j]);
                }
                break;
            case manageEnum.Delete:
                break;
            default:
                break;
        }
    }
}

【问题讨论】:

    标签: c# unity3d game-engine


    【解决方案1】:

    Add 的情况下,您正在创建一个存储在newarray 中的新数组,但您正在从array 获取数据。如果您希望在array 中更新更改,则必须将array 替换为newarray

    case manageEnum.Add:
            int itemToAdd = 0;
            newArray = new int[array.Length + 1];
            for (int i = 0; i < array.Length; i++)
            {
                newArray[i] = array[i];
            }
    
            //replace old array with new array
            array = newArray;
    
            for (int j = 0; j < newArray.Length; j++)
            {
                Debug.Log(newArray[j]);
            }
            break;
    

    另外,还有更好的方法,你可以使用Array.Resize

     case manageEnum.Add:
    
         Array.Resize(ref array, array.Length + 1);
         //now array has one item more, no need of an intermediate array.
    

    【讨论】:

      【解决方案2】:

      您似乎想在某个阶段将itemToAdd 添加到现有数组中。在这种情况下,我会稍微修改您的代码:

              case manageEnum.Add:
                  int itemToAdd = 0;
                  var tempArray = new int [ array.Length + 1 ];
                  for ( var i = 0; i < array.Length; i++ )
                      tempArray [ i ] = array [ i ];
                  tempArray [ array.Length ] = itemToAdd;
                  array = tempArray;
      
                  for ( var i = 0; i < array.Length; i++ )
                      Debug.Log( array [ i ] );
                  break;
      

      也不需要类级别的临时数组 (newArray)。我们在 case 块中创建了一个新的,所以我们不妨在那里定义它。

      同样,我们可以看看 Delete 案例:

              case manageEnum.Delete:
                  var newArraySize = array.Length - 1;
       
                  // Option 1. The brute force way.
                  var tempArray = new int [ newArraySize  ];
                  for ( var i = 0; i < newArraySize ; i++ )
                      tempArray [ i ] = array [ i ];
      
                  // Option 2. The single line way.
                  Array.Resize ( ref array, newArraySize );
       
                  array = tempArray;
      
                  for ( var i = 0; i < array.Length; i++ )
                      Debug.Log( array [ i ] );
                  break;
      

      在上面的删除块中,您可以使用其中一个选项。如果您不删除,代码实际上仍然可以工作,因为尝试将数组大小调整为相同大小实际上不会做任何事情......但是,请删除其中一个或另一个选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-10
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多