1

最近、Unity から、Xamarin Studio で Mono を使用して明るく光沢のある OpenGl/Freeglut ソリューションに切り替えました。Unity の手持ちで学びたいことを学んでいなかったので、これは賢明な動きだと思いました。どうやらこれは最も賢明な動きではなかったようですが、私は今コミットしています。Awake() と Update() です。

それは魔法でした。必要なオブジェクトはすべてモノビヘイビアーを拡張でき、フレームごとにいくつかのコードを実行できました。しかし、初心者の 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 が舞台裏でこれをどのように行っているかはわかりませんが、知りたいと思っています。これを実装する最も簡単な方法は、 Observer Design Patternを見ることだと思います。あなたが探している基本的なアイデアは、誰もが継承する MonoBehavior インターフェイスまたは抽象クラスを持つことです。次に、存在するすべての MonoBehavior でループを実行して、MonoBehaviors を処理するクラスを作成します。

于 2013-11-09T08:32:40.380 に答える