Lumberyardに触れる(最終回)-衝突判定編

※2018年1月18日時点の情報です
[← Lumberyardに触れる(5)-ゲーム開始編](https://qiita.com/OrotiYamatano/items/069923c94c84bb604a88)
#はじめに
今回はキャラクターが指定範囲に入った場合にゲームをクリアの文字を表示させる処理をいれます。
多分今回が最後になります。

#エンティティ作成
到着するべきエリアが分かりづらいので、オブジェクトなどを設置していきます。
Asset Browserでオブジェクトを指定してPersectiveにドラッグすると追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/6517a628-a943-337d-aa58-7be1b647796f.png)
今回は2つ設置。

次にあたり判定の空間を設定するためにEntityOutlinerにて右クリックしてCreate Entityをします。
下のような構成にしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/7b5094b6-609d-a019-8672-7f66234e2ca5.png)
EndPointが範囲を設定するエンティティで
他2つのエンティティが先程追加したオブジェクトになります。

EndPointにBoxShapeとTriggerAreaのコンポーネントを追加します。
BoxShapeの範囲が衝突範囲でTriggerAreaが衝突判定の設定です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/016980c7-a3d3-365e-e1c2-36e60ed89833.png)

下ような見た目になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/c26c28e6-881e-b3af-c962-e24dad05b527.png)

#Luaスクリプト
衝突を判定と、処理を実装するためにスクリプトを追加します。

まず、はじめにTriggerEventのスクリプトをEndPointのEntityに
Add Componentします。
EventNameが衝突時に発行されるイベント名になります。(詳しい中身は自分で読んで下さい)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/458928b5-9010-51b1-d388-90d2f11c9c31.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/43fd3064-65fb-cd4f-0d76-5f8a7533b022.png)

次にスクリプトを追加し、
イベント受取のスクリプトを自作します。
早速中身を見ていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/1604ad4e-8c4c-8f67-939a-de5bf827f88e.png)

スクリプト全体

```gameend.lua
local gameend =
{
    Properties =
    {
        EventName = { default = "", description = "" },
    }
}

function gameend:OnActivate()
    self.ShowScreenEventId = GameplayNotificationId(self.entityId, self.Properties.EventName, "float");
    self.ShowScreenHandler = GameplayNotificationBus.Connect(self, self.ShowScreenEventId); 
end

function gameend:OnDeactivate()
    if (self.canvasEntityId ~= nil) then
        UiCanvasManagerBus.Broadcast.UnloadCanvas(self.canvasEntityId);
        self.canvasEntityId = nil;
    end
end

function gameend:ShowScreen()
    self.canvasEntityId = UiCanvasManagerBus.Broadcast.LoadCanvas("UI/gameend.uicanvas");
end

function gameend:OnEventBegin(value) 
    if (GameplayNotificationBus.GetCurrentBusId() == self.ShowScreenEventId) then
    
        self:ShowScreen();
        if(ShowScreenHandler ~nil)
            self.ShowScreenHandler:Disconnect();
            self.ShowScreenHandler = nil;
        end
    end
end

return gameend
```

##OnActivate
```gameend.lua
function gameend:OnActivate()
    self.ShowScreenEventId = GameplayNotificationId(self.entityId, self.Properties.EventName, "float");
    self.ShowScreenHandler = GameplayNotificationBus.Connect(self, self.ShowScreenEventId); 
end
```
OnActivate(エンティティ開始時に動作)で通知バスに接続します。

##OnDeactivate
```gameend.lua
function gameend:OnDeactivate()
    if (self.canvasEntityId ~= nil) then
        UiCanvasManagerBus.Broadcast.UnloadCanvas(self.canvasEntityId);
        self.canvasEntityId = nil;
    end
end
```
エンティティ終了時に、キャンバスがロードされていれば、消すようにします。
##OnEventBegin
```gameend.lua
function gameend:OnEventBegin(value) 
    if (GameplayNotificationBus.GetCurrentBusId() == self.ShowScreenEventId) then
    
        self:ShowScreen();
        if(ShowScreenHandler ~nil)
            self.ShowScreenHandler:Disconnect();
            self.ShowScreenHandler = nil;
        end
    end
end
```
イベントが送られた時プロパティで設定したイベントと同じならShowScreenの実行と
通知バスとの接続を切るようにしました。
ShowScreenが実行されたら通知バスはもう要らないので、さっさと接続は切ります。

##ShowScreen
```gameend.lua
function gameend:ShowScreen()
    self.canvasEntityId = UiCanvasManagerBus.Broadcast.LoadCanvas("UI/gameend.uicanvas");
end
```
ShowScreenは指定したキャンバスをロードします。
キャンバスはゲームスタートの文字を作った時、同様にUIEditorで作成しました。

Luaスクリプトは以上になります。
しかし、一点だけオブジェクトの修正があります。

#オブジェクトの衝突判定

オブジェクトを追加しただけでは下のようにキャラクターがめり込んでしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/051de1b0-f9ca-fdf4-9aa1-4d79dce21edd.png)

解決するためには2つコンポーネントを追加する必要があります。

衝突判定を追加するコンポーネントに追加するのは
RigidBodyPhysicsとMeshColliderです。
(RigidBodyPhysicsではなくStaticPysicsでも良いです)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/2838bff8-02ad-1dcb-2704-6163c8ef2978.png)

RigidBodyPhysicsで実装する場合は一点注意が必要で、
今回作ったスクリプトの衝突判定で反応してしまうので
Interacts with triggersのチェックを外す必要があります。
これで実装完了です。

うまく動けばキャラを指定の範囲まで移動した時に
キャンバスが表示されるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/1e20ce9d-1624-e6d4-a39f-cdffcffd7f9a.png)
以上で全行程の終了となります。

#まとめ
以上で「Lumberyardに触れる」は終了となります。

正直ゲーム以外のコンテンツなら[Amazon Sumerian](https://aws.amazon.com/jp/sumerian/?nc2=h_m1)っていうものもあるので、そちらにLumberyardの機能が吸収されそうな印象をうけました。
社員の方にたまたま聞く機会があったのですが、newWorldっていうプロジェクト(?)で新しいサンプルを作っているとの噂があるので、まだ進展はあると思いますし、
日本でも手軽にTwitchをつかった色んなゲームが出て欲しいので応援したいところではあります。

しかし、ぶっちゃけ勢いが落ちてるので不安です。
個人的にはCrytekがどうなるか、ECサイトメインであるアマゾンがしっかりゲームづくりをサポートしてくれるのか、今後もちゃんと開発してくれるのかを含めて、どうなるか不安で、どの企業も手を付けられていないような印象をうけました。

暇を持て余して業務中にひたすら触っていましたが、正直触った意味があったのか、よくわかりませんでした。
この資料が、どこかの誰かの役に立つとうれしいです。
最後まで読んでくださり、ありがとうございました。