C# 将SkillCoolDown值作为唯一参数传递给方法

C# 将SkillCoolDown值作为唯一参数传递给方法,c#,unity3d,design-patterns,parameters,C#,Unity3d,Design Patterns,Parameters,我有一个技能基类和两个从类技能继承的独立技能类。每项技能都有自己的技能冷却值。我设置了CoolDownManager类来可视化技能的冷却时间,但是我不知道如何为管理者设置SkillCoolDown值,这对于每种技能都是不同的。谢谢你的帮助 公开课技能 { 私有字符串skillName; 私人智力技能损害; 私有字符串技术描述; 私人智力技能冷却; 公共字符串SkillName{get;set;} public int SkillDamage{get;set;} 公共字符串SkillDescrip

我有一个技能基类和两个从类技能继承的独立技能类。每项技能都有自己的技能冷却值。我设置了
CoolDownManager
类来可视化技能的冷却时间,但是我不知道如何为管理者设置
SkillCoolDown
值,这对于每种技能都是不同的。谢谢你的帮助

公开课技能
{
私有字符串skillName;
私人智力技能损害;
私有字符串技术描述;
私人智力技能冷却;
公共字符串SkillName{get;set;}
public int SkillDamage{get;set;}
公共字符串SkillDescription{get;set;}
公共int技能冷却{get;set;}
公共技能(){}
} 
公共类冷却管理器:MonoBehavior
{
公共技能;
私人秒表冷却;
私人按钮;
私密图像;
私人智力技能冷却;
公共无效OnSkillUse(按钮btn){
skill=new skill();//这里应该实现SkillCoolDown值,我想以某种方式显示使用了哪种技能。
button=btn.GetComponent();
fillImage=btn.transform.GetChild(0.gameObject.GetComponent();
btn.interactiable=false;
fillImage.fillAmount=1;
冷却时间=新秒表();
冷却。开始();
start例程(CoolDownAnimation());
}
私有IEnumerator冷却动画(){
while(cooldown.IsRunning&&cooldown.appeased.TotalSeconds
下面是一个技能类的例子,应该从中传递值
SkillCoolDown

公共类基本技能:技能
{
公共BasicTack()
{
技能冷却时间=2;
}
}

可以通过构造函数注入将
技能
传递给
冷却管理器

public class CoolDownManager : MonoBehaviour 
{ 
   public Skill skill;
   // other properties

   public CoolDownManager(Skill skillParam)
   {
      skill = skillParam;
   }

   // do whatever you want with skill
}

这是使用计算机解决的完美问题

下面的类继承自
ScriptableObject
,并定义与
技能类中相同的数据。使用此类的
CreateAssetMenu
属性,可以创建此类型的新资产。在项目窗口中右键单击并导航到菜单项
战斗/技能/新技能
,然后您将拥有此类型的资产

注意:由于这是一项资产,它隐式地具有属性
name
,因此您可以相应地命名
技能
资产

[CreateAssetMenu(fileName=“NewSkill.asset”,menuName=“战斗/技能/新技能”)]
公共类技能:ScriptableObject
{
[SerializeField]private int_damage=默认值;
[SerializeField]私有字符串_description=默认值;
[SerializeField]私有int\u冷却时间=默认值;
公共int损害=>\u损害;
公共字符串描述=>\u描述;
公共int冷却时间=>\u冷却时间;
}
现在您可以创建
Skill
资产,继续创建您的两项技能,并在inspector中填写详细信息

接下来,您需要一种使用
技能的方法。我已经放弃了冷却管理器,而选择了一个按钮。查看以下内容

[RequireComponent(按钮类型))]
公共类SkillButton:MonoBehavior
{
[SerializeField]私人技能_Skill=默认值;
[SerializeField]private Button\u Button=默认值;
[SerializeField]私有映像\u fillImage=默认值;
私人秒表_Stopwatch=新秒表();
私人空间
{
//连接一个方法,以便在单击按钮时侦听。
_button.onClick.AddListener(onClick);
}
//单击按钮时会调用此方法。
私有void OnClick()
{
start例程(CoolDownAnimation());
}
私有IEnumerator冷却动画()
{
//立即防止再次单击按钮。
_button.interactiable=false;
_秒表。开始();
while(_stopwatch.IsRunning&&u stopwatch.appeased.TotalSeconds<_skill.cooldown)
{
_fillImage.fillAmount=(float)\ u stopwatch.appeased.TotalSeconds/\ u skill.cooldown;
收益返回空;
}
_fillImage.fillAmount=0;
_button.interactiable=true;
_秒表;
_秒表复位();
}
//使用此选项可以自动连接引用。
私有void OnValidate()
{
如果(_按钮==null)
{
_button=GetComponent();
}
如果(_button!=null&&u fillImage==null)
{
_fillImage=_button.transform.GetChild(0.gameObject.GetComponent();
}
}
}
SkillButton
组件连接到您希望控制技能的
按钮,然后连接各种
skill
对象,使其与该按钮关联

所有这些都解决了,你应该有接近你想要的功能