尝试在另一个脚本中使用 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);
}
我是编写游戏的新手,所以我的逻辑可能不适合创建统计数据。
快速介绍:我正在创建一个游戏,它会根据玩家的命令生成单位去与其他单位作战。为了存储所有不同的单位统计信息,我正在创建一个 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);
}