背景
最近は設定の多いタイクーンゲームの制作を始めていてバグがところどころ散見され始めました。設計がごちゃごちゃで一つの部分を修正するのにそれ以外のところまで修正しなきゃならない状況が多々ありました。そこでしっかりと整理しそれぞれの機能の責任を分散する必要があると感じました。その第一歩?であるインターフェースの書き方を理解していきたいと思います。
やること
- Verseの
creative_device
クラスにインターフェースを実装 - そのクラスの関数をインターフェース経由で呼んでみる
という感じになります。
全体コード
sample_interface
sample_interface := interface():
GetScore() : int
GetScore2() : int
これが本日の主役となります。いつものクラスの部分をインターフェースに変えて宣言していますね。中身は関数名とその引数のみを書いておく感じになります。(処理は記述しません。)
sample_model_device
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
sample_model_device := class(creative_device,sample_interface):
var score : int =10000
var score2 : int =99999
GetScore<override>() : int =
Print("Model GetScore:{score}")
return score
GetScore2<override>() : int =
Print("Model GetScore2:{score2}")
return score2
インターフェースを実装しているクラスになります。
クラスの実装は一つだけですが、インターフェースの実装は複数できるようになっています。
インターフェースが持っている関数は<override>
を付けて確実に実装しましょう!
sample_model_controller_device
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
sample_model_controller_device := class(creative_device):
@editable
Model: sample_model_device = sample_model_device{}
OnBegin<override>()<suspends>:void=
InterfaceHandle(Model)
InterfaceHandle(model : sample_interface):void=
score := model.GetScore()
score2 := model.GetScore2()
Print("Controller Score: {score}")
Print("Controller Score2: {score2}")
ここではsample_model_device
を取得してInterfaceHandle
ではインターフェス経由で関数を呼ばせています。
実行結果
まとめ
インターフェースを実装させインターフェース経由で呼び出すときにもしそのクラスの内部処理の修正したとしても呼び出し側の影響が少なくなるというところがよいですよね。ただチームで制作している場合にはVerseを触るメンバーがしっかりとそれについて理解していないと大変なことになります。使う場所使わない場所をしっかりと読み取っていきたいです。
余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。