Unity3D C# 脚本:Class 变量数组数据问题
Unity3D C# Script : Class Variable Array Data Issue
我有一个简单的问题要问。只需检查下面的代码,问题就在代码的结果中。希望大家帮帮我..
文件inventory.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class inventory : MonoBehaviour {
public List<item> tmp = new List<item> ();
public item itema;
itemDatabase database;
// Use this for initialization
void Start () {
int slotAmount = 0;
database = GameObject.FindGameObjectWithTag ("itemDatabase").GetComponent<itemDatabase> ();
//Generate the Slot and Slot Name;
for(int i = 1; i <= 24; i++) {
tmp.Add (new item());
}
itema = database.items [0];
tmp [0] = itema;
tmp [0].itemStock = 1;
Debug.Log (tmp[0].itemID + " - " + tmp[0].itemStock);
itema = database.items [0];
tmp [1] = itema;
tmp [1].itemStock = 2;
Debug.Log (tmp[1].itemID + " - " + tmp[1].itemStock);
itema = database.items [0];
tmp [2] = itema;
tmp [2].itemStock = 3;
Debug.Log (tmp[2].itemID + " - " + tmp[2].itemStock);
Debug.Log (tmp[0].itemID + " - " + tmp[0].itemStock);
Debug.Log (tmp[1].itemID + " - " + tmp[1].itemStock);
}
}
结果是:
tmp Array [0] : 1 Stock 1
tmp Array [1] : 1 Stock 2
tmp Array [2] : 1 Stock 3
tmp Array [0] : 1 Stock 3 // this array recently stock was 1 now replace with 3 Why it is replace i have use an array ?
tmp Array [1] : 1 Stock 3 // this array recently stock was 2 now replace with 3 Why it is replace i have use an array ?
问题在 tmp Array[0] 和 tmp Array[1] 上,它已被 tmp Array[2] 取代。
谢谢
丹尼斯
这是因为在 C# 中 itema = database.items [0];
不会创建副本,而是 itema 将始终指向对象。所以发生的事情是你没有向你的数组添加重复项,而是所有的东西都指向相同的元素,即 database.items[0]
的值。反过来正在修改。
我宁愿建议您像这样创建一个新的 class 实例
在项目中设置 database.items[0] 个值
itema = new items( database.items [0].name, database.items [0].ID, ....)
然后分配这个项目
tmp [0] = 意达;
请记住,在 C# 中,变量只是指向对象,并且在您尝试分配它时不会创建重复项。你需要管理它。
我有一个简单的问题要问。只需检查下面的代码,问题就在代码的结果中。希望大家帮帮我..
文件inventory.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class inventory : MonoBehaviour {
public List<item> tmp = new List<item> ();
public item itema;
itemDatabase database;
// Use this for initialization
void Start () {
int slotAmount = 0;
database = GameObject.FindGameObjectWithTag ("itemDatabase").GetComponent<itemDatabase> ();
//Generate the Slot and Slot Name;
for(int i = 1; i <= 24; i++) {
tmp.Add (new item());
}
itema = database.items [0];
tmp [0] = itema;
tmp [0].itemStock = 1;
Debug.Log (tmp[0].itemID + " - " + tmp[0].itemStock);
itema = database.items [0];
tmp [1] = itema;
tmp [1].itemStock = 2;
Debug.Log (tmp[1].itemID + " - " + tmp[1].itemStock);
itema = database.items [0];
tmp [2] = itema;
tmp [2].itemStock = 3;
Debug.Log (tmp[2].itemID + " - " + tmp[2].itemStock);
Debug.Log (tmp[0].itemID + " - " + tmp[0].itemStock);
Debug.Log (tmp[1].itemID + " - " + tmp[1].itemStock);
}
}
结果是:
tmp Array [0] : 1 Stock 1
tmp Array [1] : 1 Stock 2
tmp Array [2] : 1 Stock 3
tmp Array [0] : 1 Stock 3 // this array recently stock was 1 now replace with 3 Why it is replace i have use an array ?
tmp Array [1] : 1 Stock 3 // this array recently stock was 2 now replace with 3 Why it is replace i have use an array ?
问题在 tmp Array[0] 和 tmp Array[1] 上,它已被 tmp Array[2] 取代。
谢谢 丹尼斯
这是因为在 C# 中 itema = database.items [0];
不会创建副本,而是 itema 将始终指向对象。所以发生的事情是你没有向你的数组添加重复项,而是所有的东西都指向相同的元素,即 database.items[0]
的值。反过来正在修改。
我宁愿建议您像这样创建一个新的 class 实例
在项目中设置 database.items[0] 个值
itema = new items( database.items [0].name, database.items [0].ID, ....)
然后分配这个项目 tmp [0] = 意达;
请记住,在 C# 中,变量只是指向对象,并且在您尝试分配它时不会创建重复项。你需要管理它。