1

最近,我使用 Xamarin Studio 中的 Mono 从 Unity 切换到了明亮闪亮的 OpenGL/Freeglut 解决方案。我认为这是一个明智之举,因为我没有通过 Unity 的手持设备学习我想学习的内容。显然这不是最明智的举动,但我现在承诺。我非常想念两件事:Awake() 和 Update()。

这太神奇了。我想要的任何对象都可以扩展 monobehaviour 并且我可以每帧运行一些代码。但作为一个新手 csharper,我不完全确定如何在统一之外复制它。基本上我有我的主程序;精简版是这样的:

using System;
using Tao.FreeGlut;
using OpenGL;

namespace Project
{
    class Program
    {
        private static int width = 1280, height = 720;

        public static MyPlayerObj player = new MyPlayerObj();
        public static MyMouseListenerObj mouseE = new MyMouseListenerObj();
        public static MyKeyboardListenerObj keyboardE = new MyKeyboardListenerObj();
        public static MyEnemyObj e1 = new MyEnemyObj();
        public static MyEnemyObj e2 = new MyEnemyObj();
        public static MyEnemyObj e3 = new MyEnemyObj();

        public static void Main(string[] args)
        {
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
            Glut.glutInitWindowSize(width, height);
            Glut.glutCreateWindow("Project");
            Glut.glutIdleFunc(Update);
            Glut.glutDisplayFunc(DisplayFunc);

            Awake();

            Glut.glutMainLoop();
        }

        public static void Awake()
        {
            // Run all Awake Methods
        }

        private static void DisplayFunc()
        {
        } 
        public static void Update()
        {
            Gl.Viewport(0, 0, width, height);
            Gl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            // Run All Update Methods
            // Then run all LateUpdate methods

            Glut.glutSwapBuffers();
        }
    }
}

在此示例中,我有一些对象,例如玩家、键盘和鼠标侦听器以及一堆敌人。现在,我想要做的是能够调用每个对象的 Awake 方法(如果有的话),或者如果没有的话就忽略它。这可能类似于(伪代码,请原谅我):

public static void Update()
{
    interfacedObjects = assembly().findAllObjectsUsingInterface(IUpdateable);
    foreach (var item in interfacedObjects)
    {
        if(item.hasMethod('Update')
            item.call('Update');
    }
}

本质上,我想要做的是将我的对象链接到父级“Monobehaviour”。我想让我的班级结构尽可能简单。

public class MyPlayerObj : MyMonoBehavior
{
    public void Update()
    {
        // Do stuff
    }
}
public class MyMonoBehavior : IUpdateable
{
    public virtual void Update()
    {
    }
}

有人对我有什么建议吗?我知道它可能,但我只是不知道这种设计模式叫什么,也不知道如何执行它。

我应该提到,为了学习,我更愿意将此解决方案保留在本机代码库中。

4

1 回答 1

2

有趣的问题。

我不知道 Unity 在幕后是如何做到这一点的,但我很想知道。我认为实现这一点的最简单方法是查看观察者设计模式。您正在寻找的基本思想是拥有一个每个人都可以继承的 MonoBehavior 接口或抽象类。然后,您将拥有一个通过对存在的每个 MonoBehavior 运行循环来处理 MonoBehavior 的类。

于 2013-11-09T08:32:40.380 回答