(文字のフォント:Comic Sans MS)
S&C002_[Doc] Creating a new Entity(新規の[Entity]を作成します。)
Description(解説):フローグラフのサポートを得ながら、Lua スクリプトの作成により新たな[Entity]を追 加します。
Reference(参考資料、参考サイト)
● タイトル:Creating a new entity
http://www.crymod.com/thread.php?threadid=16182 ● 作成者:Ins ● Skill Level: 中級 ● チュートリアルタイプ:資料[Doc] ● キーワード:Scripting
解説者の情報
● 解説者:Crysis Sandbox2 In-Deep 管理者
● ホームページURL:http://www4.atpages.jp/~alexwong2/index.php?FrontPage ● E メール:alexwchvui@hotmail.com ● このチュートリアルに対するコメント: - [*正][Inputs][Outputs]コードを[FlowEvents]コードの上に記入します。 ● ページ数:17 ページ
S&C002_Page1
Lead in(はじめに)
● このチュートリアルでは、基本の[Entity]の追加方法を述べます。もっと詳しく知 りたい場合、Crysis のスクリプトを調べてみてください。 ● 作成した[Entity]がモデルとして、In-game にも使用できます。作成した[Entity] を使用すると、[Entity]が複製され、オリジナル[Entity]の隣に配置されます。 ● このチュートリアルはCrysis の SDK ではありません。 ● [luacompiler.zip]をダウンロードして解凍します。[LuaCompiler.exe]を[..\Crysis\ bin32]フォルダにコピーします。S&C002_Page2
Step 001 : Setting up an entity ([Entity]を設定します。)
● [..\Crysis\Mods\]フォルダに空フォルダ[MyMod]を作成します。
● [Editor.exe]ショートカットのプロパティ→[ショートカット]タブ→[リンカ先]に
[ -DEVMODE -MOD MyMod ]を追加します。
● [MyMod]フォルダに[Game]新規フォルダを作成します。[Game]フォルダに
[entities]新規フォルダを作成します。[entities]フォルダにテキストエディタで [MyEntity.ent]新規ファイルを作成します。
- [ .ent]形式ファイルはゲームエンジンに[entity]をロードさせるためです。
● テキストエディタで[MyEntity.ent]を開き、以下のように追加します。 <Entity Name = “MyEntity” Script = “Scripts/Entities/MyMod/MyEntity.lua” /> ● [Note]: [MyMod][MyEntity]以外の名前は自由に設定できます。
STEP002 : The entity script(basics) [Entity]
→
スクリプトの基本
● [entity](MyEnity.ent)を設定したら、Lua ファイルを作成します。Lua ファイルに [Entity]のプロパティとコードを書きます。 ● [MyEnity.ent]で書かれたパス[..\Scripts\Entities\MyMod\MyEntity.lua]の同じ ように[MyEntity.lua]新規ファイルを作成します。 ● [..\Crysis\Game\scripts\entities\MyMod\]空フォルダを作成し、その中にテキ ストエディタで[MyEntity.lua]新規ファイルを作成します。
● [Note]:Sandbox2 エディタは Mod フォルダの[Entities]ファイルの編集・更新し
ないため、デフォルトのフォルダ[..\Crysis\Game\]フォルダに[Entities]ファイル を作成します。 ● テキストエディタで[MyEntity.lua]ファイルを開き、以下のように記入します。 MyEntity = { Properties = { fMessageDuration = 10.0, sMessage = ”Use me”, bDoesNothing = 0, object_MyModel = “Editor/Objects/objective.cgf”, Colors = { clrColor = {x=1,y=0,z=0}, }, },
S&C002_Page4
Editor = { Icon = “Target.bmp”, }, }; ● Lua コードの解説: - MyEntity = { ... } : Entity を宣言します。 - 次に、プロパティを設定します。それらのプロパティは Sandbox2 エディタの [Entity Properties]で変更できます。 -- fMessageDuration : [Entity]を使用する際、メッセージの表示時間 -- sMessage : 表示されるメッセージ -- bDoesNothing : 何もしない -- object_MyModel : [Entity]にモデルの指定 -- clrColor : メッセージの色 ● 各パラメータ名の前に、[ f ][ s ][ b ][ clr ]の接頭文字が付けます。その理由は Sandbox2 に変数の型を指定するためです。 - b : boolean → true または false
- s : string → 文字列 - f : float 4→ バイト単精度浮動小数点数 - object_ : モデル(ファイル開くダイアログ付き) - clr : 色(色選択ダイアログ付き) -- clrColor に更のプロパティテーブル[x][y][z]があります。Sandbox のサブカテ ゴリです。
S&C002_Page5
● [Properties]の次に、[Editor]のプロパティです。Sandbox で使用するアイコンを 設定します。 - Editor = { Icon=”Target.bmp”, }; ● Lua ファイルに他の変数の指定もできます。ここでは、以上の設定で終わります。
STEP 003: Sandbox2 エディタを起動します。
● 作成したMod 用の[Editor.exe]ショートカットをダブルクリックして、Sandbox2エディタを起動します。マップを開かないまま、[RollupBar] [Objects] [Entity]→ → を選択して、[MyMod] [MyEntity]→ がロードされたことを確認します。
● [MyEntity]をダブルクリックして、[Entity Properties]の表示が正しいことを確認
します。文字の前に[?][ab][n][ ]△ などの記号が現れます。
● [Note]:[Entity Properties]が表示されなかった場合、[Tools]メインメニュー
→[Reload Scripts]を選択して、[Errors Report]を確認します。
- エラーの所を確認して Lua の内容を修正して上書き保存してください。Sanbox2 エディタをもう一度再起動してください。
STEP 004 : Lua スクリプトに更のコードを追加します。
● Sandbox2 エディタを起動したまま、[MyEntity.lua]にコードを追加します。 ● STEP003 の設定では、[MyEntity]が何も機能しないので、更のコードを以下のよ うに追加します。 Function MyEntity:OnInit() self:OnReset(); end ● [解説:] - OnInit() : マップを開く時に、[Entity]の初期設定をゲットします。 - 次に OnReset()の機能を呼び出します。(*OnReset()の機能を次から作成しま す。)S&C002_Page7
● [OnReset()]機能を追加します。 function MyEntity:OnReset() if(self.Properties.object_MyModel ~="") then self:LoadObject(0,self.Properties.object_MyModel); end end ● [解説]:エディタが起動する時、また、[OnInit()]から[OnReset()]の機能が呼び出 され、自分をロードします。[if] もし モデルが[~=” ”] 空 string でなかったら [then]、モデルをロード [LoadObject] します。 ● [MyEntity.lua]を上書き保存します。 ● Sandbox2 エディタで適当なマップを開きます。 ● [MyEntity]をマップ上に配置して、[Reload Script]ボタンをクリックすると、Lua コードが再ロードされます。 ● [*Note]:[Edit Script]ボタンはデフォルト[..\Crysis\Game\Scripts\Entities\]フォ ルダ内のファイルのみを開きます。[Reload Script]ボタンは[..\Crysis\Bin32\]フォ ルダ内に[LuaCompiler.exe]があったら、実行されます。
S&C002_Page8
● [Entity Properties] [MyModel]→ の[開く]アイコンをクリックして、適当なモデル を選択して、[Reload Script]ボタンをクリックして、モデルが変わったことを確認 します。 ● もし、モデルが更新しなかったら、以下の[OnPropertyChange()]機能を追加して ください。 Function MyEntity:OnPropertyChange() self:OnReset(); end -[解説]:[OnPropertyChange()]の機能はエディタでの[Entity Properties]が変更 された場合、[Reload Script]ボタンをクリックしなくでも、自動更新されます。 (*[Reload Script]ボタンをクリックせずに、モデルを変更してみてください。) ● 現時点の設定では、[MyEntity]にモデルをロード・変更できます。 ● 次に、[MyEntity]を使えるように[IsUsable][GetUsableMessage]機能を追加しま す。 function MyEntity:IsUsable(user) return 2; end funtion MyEntity:GetUsableMessage(idx) return self.Properties.sMessage; end
S&C002_Page9
● [ゲームモード]に切り替え、[MyEntity]に近づくと、[Use Me]の表示が現れること
を確認します。
● [解説]:
- [IsUsable() return 2]は[MyEntity]を使えるように設定します。
- [GetUsableMessage]は[MyEntity]が使用される際にメッセージを表示される機 能です。プロパティの[sMessage: Use me]を表示メッセージとして使用します。
● 現時点では、[MyEntity]使用できるようにしたが、更の使用目的の機能を追加しま す。 Function MyEntity:OnUsed(user,idx) CryAction.Persistant2DText(string.format(“Used>%s”, self.Properties.sMessage),2,self.Properties.Colors.clrColor,”OnUsed”,self.Prope rties.fMessageDuration); end ● [Reload Script]を実行してから、[ゲームモード]に切り替え、[F]キーを数回押す と、[Used>Use me]の文字がプレイヤーの HUD に現れます。また、時間が経つと、 [Used>Use me]の文字をだんだん薄くなります。
S&C002_Page10
● [解説]:
- プレイヤーのスクリーン上にメッセージを表示される機能の設定です。メッセー ジは[User>self.Properties.sMessage]、プロパティの[sMessage: Used me]です。 - 第 2 項目:メッセージのサイズです。通常[2]に設定します。 - 第 3 項目:[色]指定です。プロパティの[Color]です。 - 第 4 項目:メッセージの名前です。 - 第 5 項目:メッセージの表示時間[秒単位]です。 (*プロパティをいじって、その結果を確認してみてください。) ● 以下[MyEntity.Lua]全体のコードです。
S&C002_Page11
Step005 : Extending our entity ([Entity]を拡張します。)
● Step004 で基本の[MyEntity]を設定した、ここから、更のコードを追加します。 ● まず、[MyEntity]に物理的なモデルに設定します。 ● [OnReset()]機能に[PhysicalizeThis]を以下のように追加します。 Function MyEntity:OnReset() if(self.Properties.object_MyModel~=””)then self:LoadObject(0,self.Properties.object_MyModel); end self:PhysicalizeThis(); end function MyEntity:PhysicalizeThis() local Physics={ bRigidBody=1, bRigidBodyActive=0, bRigidBodyAfterDeath=1, bResting=1, Density=-1, Mass=5, }; EntityCommon.PhysicalizeRigid(self,0,Physics,1); end ● [解説]:エディタで使用されるパラメータを確認しながら、[PhysicalizeThis]機能 に物理を設定します。それらの設定を[EntityCommon.PhysicalizeRigid()]に渡しま す。 ● これで、[MyEntity]が物理的に機能されます。[ゲームモーで]に切り替えて、確認 します。(*物理的な設定をできないモデルがあるため、確認してみてください。)S&C002_Page12
● 次に、[MyEntity]を使う時に、[MyEntity]を複製する機能のコードを追加します。
function MyEntity:OnUsed(user, idx)
CryAction.Persistant2DText(string.format("Used> %s",
self.Properties.sMessage),2, self.Properties.Colors.clrColor, "OnUsed", self.Properties.fMessageDuration); self:Clone(); end function MyEntity:Clone() local clone = { class = "MyEntity", }; clone.properties = self.Properties; local ent = System.SpawnEntity(clone); local pos = self:GetPos();
pos.x = pos.x + 1; ent:SetPos(pos); end
● [解説]:これで[MyEntity]を複製できます。 - まず、クラスを[MyEntity]に設定して、デフォルトの値で[MyEntity]を生成しま す。 - [clone.properties=self.Properties;] : [MyEntity]のプロパティを[Clone]プロパティに渡します。 - [local pos=self:GetPos();] : [MyEntity]の位置をゲートします。 - pos.x=pos.x+1; : [MyEntity]の位置に[1]の値を足します。(そうすると、複製した[Entity]をはっ きり分かります。) - [ent:SetPos(pos)] : [1]を足した位置を複製した[Clone]に設定します。
Step 006 : Adding Flowgraph support(フローグラフのサポートを追加)
● すべてのフローグラフ情報は[FlowEvents]にあります。それを定義しなければなり ません。以下のようなコードを追加します。 MyEntity.FlowEvents={ Inputs= { Clone={MyEntity.Event_Clone,”bool”}, Message={MyEntity.Event_Message,”string”}, }, Outputs= { Used=”bool”, }, } ● [解説]:フローグラフの設定はそれほど難しくない。フローグラフのノードに [Inputs]と[Outputs]部分があります。[Inputs]側に[Clone]と[Message]をゲート します。[MyEntity]が使用された際に、[Outputs]側に[Used]機能が呼び出されま す。
● [疑問]:[Clone= ?]と[Message= ?]、それから、[MyEntity.Event_Clone]と
[MyEntity.Event_Message]はどこから定義される??
● [答え]:それらも定義しなけらばなりません。以下のように定義します。 function MyEntity:Event_Clone(sender) self:Clone(); end function MyEntity:Event_Message(sender,msg) self.Properties.sMessage=msg; end ● [解説]:[Event_Clone]は[Clone()]機能を呼び出すだけです。[Event_Message]で はフローグラフでのプロパティを変更できます。これで、[Inputs]側の設定を終わ りました。 ● [Outputs]側は[Outputs]の[Event]を始動させる所にコードを追加します。
function MyEntity:OnUsed(user, idx)
CryAction.Persistant2DText(string.format("Used> %s",
self.Properties.sMessage),2, self.Properties.Colors.clrColor, "OnUsed", self.Properties.fMessageDuration); self:Clone(); self:ActivateOutput(“Used”,true); end ● [OnUsed()]機能に[Used]を[true]に設定するだけです。 ● これで、フローグラフの設定を終わりました。 ● [MyEntity.lua]を上書き保存します。 ● Sandbox2 エディタをもう一度再起動します。適当なマップを開きます。
● Sandbox2 エディタで[MyEntity]をマップに配置します。[Flow Graph] [Create]→
ボタンをクリックします。
● 適当なグループ名を記入して、[OK]ボタンをクリックします
● [MyEntity]を選択したまま、[Flow Graph]ウィンドウのグレー所にマウス右クリッ
クして、[Add Graph Default Entity][Fit Graph to View]を選択すると、作成した [entity:MyEntity]ノードが現れます。
● グレー所にマウス右クリックして、[Add Node] [HUD]→ →
[DisplayInstructionmMessage]ノードを追加して、以下のように設定します。
● [ゲームモード]に切り替えして、[MyEntity]の前に[F]キーをクリックして、
[Flowgraph is here]のメッセージ、[Used>Use me]のテキスト、[Clone]が生成され たことを確認します。
● [*注]:[Event_Clone][Event_Message]の[Inputs]と[FlowEvents]コードの順が間
違った場合、[Inputs]側が表示できなくなります。
● [*正][Inputs][Outputs]コードを[FlowEvents]コードの上に記入します。