是否可以从不同的脚本文件 Unity C# 添加列表 <item> 值

Is that Possible To Add List<item> value from different Script File Unity C#

我有一个简单的问题。

我有两个文件脚本:

  1. Player.cs

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class player {
        public List<item> itemx = new List<item> (); // Here
    
    
    }
    
  2. 文件Inventory.cs

            using UnityEngine;
            using System.Collections;
            using System.Collections.Generic;
            using UnityEngine.UI;
    
            public class inventory : MonoBehaviour {
                public player playerx;
    
                itemDatabase database;
    
                // Use this for initialization
                void Start () {
    
                    database = GameObject.FindGameObjectWithTag ("itemDatabase").GetComponent<itemDatabase> ();
                    //Generate the Slot and Slot Name;
                    for(int i = 1; i <= 24; i++) {
                        playerx.itemx.Add(new item()); // Here
    
                        playerx.itemx[i] = database.items[i]; // And Here
    
                    }
                }
            }
    

正如您在 player.cs 文件中所见,我声明了一个列表变量:

public List<item> itemx = new List<item> (); // Here

在 Inventory.cs 文件中,我想使用 :

添加值
playerx.itemx.Add(new item()); And Here

是否可以将值变量保存到 player.cs 文件?

谢谢

注意

在你的问题中,你有

   public class Player

而不是

   public class Player:MonoBehaviour

我想这只是一个打字错误。如果你想拥有一个“免费”class 播放器(如在 OO 环境中),你不能那样做。


正确,这样做绝对有问题!

几件事...

请注意,在第二个脚本中它将是:

 public player playerx; ... WRONG

 public Player player; ... CORRECT

然后

player.items.Add( .. etc )

(别忘了你当然必须拖动连接“Player player”检查器变量。如果你不知道该怎么做,请说出来,我会给你一个 link 到一个教程。)

其次,第一个脚本有问题。

Unity 中有一个愚蠢的东西,其中“public”表示“检查器变量”

事实上你想要一个“普通的”public变量,就像在任何普通编程语言中一样,奇怪的是你必须输入这个

"[System.NonSerialized] public"

这只是关于 Unity 的那些奇怪的事情之一。事实上,在许多项目中,您从不使用检查器变量。所以你只要不停地在任何地方输入“[System.NonSerialized] public”。如果您明白我的意思,那么长的“[System.NonSerialized] public”是一种“正常”的。一直使用它。仅当您特别需要检查器变量时,才使用“public”。

  public List<item> itemx...   WRONG

  [System.NonSerialized] public List<item> items...   CORRECT

这个怎么样。假设数据库对象 returns [items] 或其他东西。

                database = GameObject.FindGameObjectWithTag 

("itemDatabase").GetComponent<itemDatabase> ();
                    //Generate the Slot and Slot Name;
                    forach(item _item in database.items)
    {
 playerx.itemx.add(_item);
}

如果你的数据库 returns 有什么不同你可以试试

playerx.itemx.add(new item
{
itemproperty1 = _item.property1, 
and so on.
};