尝试在另一个脚本中使用 objects 名称作为过滤器根据 class 设置单位统计信息。 (统一)

Trying to setup unit stats based off a class in another script using objects name as a filter. (Unity)

我是编写游戏的新手,所以我的逻辑可能不适合创建统计数据。

快速介绍:我正在创建一个游戏,它会根据玩家的命令生成单位去与其他单位作战。为了存储所有不同的单位统计信息,我正在创建一个 statsheet,然后(尝试)在单位实体脚本中搜索该 statsheet,该脚本定义了关于该单位的所有内容。我有一个实体预制件,其中包含适用于所有单位的所有脚本(例如移动和损坏)。然后在 GameManager 生成实体预制件后,它会构建另一个预制件(这是实际的单位)并将其作为实体预制件内的 child 移动。

我正在尝试为每个单位添加统计数据,因此我构建了一个统计数据sheet,其中包含 non-MonoBehaviour classes 和不同的单位统计数据。然后实体脚本采用 child 的名称(这是单位名称)并从中减去“(克隆)”,然后我希望它在 stat[=29] 中搜索 class =]基于该单位名称,然后根据statsheet中的预设统计分配统计。我不知道这是否是最好的方式,甚至是一种可能的方式。但到目前为止,从逻辑上讲,这是我能想到的最好的。如果这不起作用,我愿意接受任何建议,但是,我 运行 使用当前方法的问题是我无法在另一个基于字符串的脚本中搜索 class .我已经在网上搜索了大约 2 个小时,但找不到任何东西。

实体脚本片段:

public class Entity : MonoBehaviour
{
    public Movement movement;
    public int health;
    public int damage;
    public int attackSpeed;
    public int range;
    public int moveSpeed;
    public bool flying;
    public int cost;
    private void Start()
    {
        movement = GetComponent<Movement>();
        string unitName = transform.GetChild(0).name;
        unitName = unitName.Remove(unitName.Length-7);

        //unitName for this example returns "Pen1"

        health = unitName.health;
    }

这是我的统计数据sheet 片段:

public class Pen1
{
    public int health = 50;
    public int damage= 5;
    public int attackSpeed = 1;
    public int range = 1;
    public int moveSpeed = 1;
    public bool flying = false;
    public int cost = 50;
    
}

按 class 姓名搜索没有意义,因为您的 class 姓名可能没有健康属性。然后它会使编译器出错。你需要另一个逻辑。如果你想在游戏中拥有不同的实体,你所要做的就是从实体class继承它们,然后自定义变量。最后预制它们,你可以随时实例化。您也不需要克隆。

public class Pen1 : Entity
{
    // setup variable in Inspector then prefab it.

    public void Write() // special method in pen that other entities doesn't have
    {
        // do something
    }
}

现在您可以执行以下操作来查找具有自己属性的笔 classes。请记住 class 定义实际上涵盖了类型,而不仅仅是不同实例的定义。所以即使有相同的方法属性和字段的笔也不需要定义另一个class.

var pens = FindObjectsOfType<Pen1>(); // it returns a list of pens

foreach (var p in pens)
{
    p.Write();
    Debug.Log(p.health);
}