【问题标题】:Assign a method to a instantiated sprite将方法分配给实例化的精灵
【发布时间】:2015-08-10 21:27:47
【问题描述】:

我正在用 C# 创建一个 2d 炮塔防御游戏,我有一个关于炮塔更新管理的问题。 我想在炮塔精灵上创建菜单,其中包含几个升级选项。

我的想法是从资源中加载菜单作为精灵,将其作为子项分配给炮塔游戏对象,然后管理按钮与炮塔之间的通信以启动升级过程。

有没有办法将方法/函数分配给新加载的资源?

例如(炮塔类):

Sprite myMenuButton = Resources.Load <Sprite> ("sprite_menu_to_load");
myMenuButton.OnMouseDown(){
// do something with the current turret's class
};

或者我必须将游戏对象精灵保存在资源文件夹中,其中包含一个脚本,该脚本将管理 OnMouseDown 方法,搜索炮塔的父脚本并使用正确的方法?

例如(在菜单精灵类中):

void OnMouseDown(){
     GameObject parent = gameObject.transform.parent.gameObject;
     turretScript parentScript = (turretScript) go.GetComponent(typeof(turretScript));
     parentScript.doUpgrade();
}

感谢您的帮助!

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我不知道 Sprite 本身(文档可能有关于它的信息,你是否已经在那里研究过?)

    但我不明白为什么你不能使用按钮而不是 Sprite 来处理你想做的这种“菜单行为”。 Button 类有一个 onClick 事件处理程序,您可以使用它在运行时分配侦听器,例如

    myMenuButton.onClick.AddListener(() => {
       //handle click here
     });
    

    您也可以通过 lambda 表达式设置方法,只需 google 一下,您会发现很多资源来学习如何使用它;)

    【讨论】:

    • 这可以是一个解决方案,我可以在炮塔脚本中创建一个按钮,为按钮分配一个纹理并将其放在炮塔附近。我会在接下来的几天里试试!
    【解决方案2】:

    首先创建一个已经实现OnMouseDown 的类和一个函数指针列表,然后将该类附加到您将要使用的每个项目上。

    public class MouseDownScript : MonoBehaviour
    {
        public List<Action> Actions = new List<Action>();
    
        void OnMouseDown(){
            foreach(Action action in Actions)
                action();
        }
    }
    

    那么你就有能力:

    {
        Sprite myMenuButton = Resources.Load <Sprite> ("sprite_menu_to_load");
        // Cache the script
        MouseDownScript mouseScript = myMenuButton.GetComponent<MouseDownScript>();
        // Add anonymous actions with a lambda as such:
        mouseScript.Actions.Add(() => /*Any action here*/);
        // Add existing functions as such:
        mouseScript.Actions.Add(MouseDownAction));
    }
    public void MouseDownAction() {}
    

    【讨论】:

    • 我正在尝试您的代码,但收到此消息:Type 'UnityEngine.Sprite' does not contain a definition for 'GetComponent' ,与 Resources.Load 相关
    • 抱歉,您必须持有您想要吸收点击事件的gameObjectGetComponent&lt;T&gt;() 仅适用于 gameObjectMonoBehaviour
    【解决方案3】:

    我不了解 Unity,但您可能能够从 Sprite 继承,向其添加 Action 类型的属性,并在使用 Resources.Load 创建它后分配它

    class Program
    {
        static void Main(string[] args)
        {
            var s = new Sprite();
            s.Action = dostuff;
            // outputs Hello
    
            s.Action.Invoke();
    
            Console.ReadLine();
        }
    
        public static void dostuff() { Console.WriteLine("Hello"); }
    
        public class Sprite
        {
            public Action Action { get; set; }
        }
    }
    

    【讨论】:

      【解决方案4】:

      创建 Sprite 时可以为 Sprite 添加新类

      Sprite myMenuButton = Resources.Load <Sprite> ("sprite_menu_to_load");
      myMenuButton.AddComponent<ClassForSprite>();
      
      In ClassForSprite
          public class MouseDownScript : MonoBehaviour
          {
              void onAction1(){
               //Code process for action 1
              }
      
              void onAction2(){
               //Code process for action 2
              }
          }
      

      【讨论】:

        【解决方案5】:

        我想你会想使用delegates

        基本上你定义一个方法签名,例如

        public delegate void ClickHandler();
        

        然后你定义该签名的一个实例:

        public ClickHandler OnClick;
        

        您可以在运行时将方法分配给 OnClick 并执行。 在炮塔中:

        public void ExecuteOnTurrent()
        {
            // do stuff in turret
        }
        
        public void LoadSprite()
        {    
            Sprite myMenuButton = Resources.Load <Sprite> ("sprite_menu_to_load");
            myMenuButton.OnClick= ExecuteOnTurrent;
        }
        

        在精灵中

        public delegate void ClickHandler();
        
        public ClickHandler OnClick;
        
        public void Update()
        {
            //- detect click or other action
            if(click and OnClick!= null)
            { 
                OnClick();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-05
          • 2023-01-04
          • 2021-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-21
          相关资源
          最近更新 更多