最近、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()
{
}
}
誰か私に提案はありますか?それが可能であることは知っていますが、このデザインパターンが何と呼ばれているのか、またどのように実行するのかはわかりません。
学習のために、このソリューションをネイティブ コードベース内に保持することをお勧めします。