Lumberyardに触れる(5)-ゲーム開始編


※2018年1月18日時点の情報です
← Lumberyardに触れる(4)-インプット編        Lumberyardに触れる(最終回)-衝突判定編 →

はじめに

今回は前回取得したイベントで文字の非表示をします。
すでに私が作成したスクリプトの解説をしていきます。

スクリプト設定

前回のスクリプトと同様の場所に
AddComponentでスクリプトを追加します。

スクリプト

全体。

gamestart.lua

local gamestart =
{
}

function gamestart:OnActivate()
    self.clickEventId = GameplayNotificationId(self.entityId, "ClickEvent", "float");
    self.clickHandler = GameplayNotificationBus.Connect(self, self.clickEventId);   
    self.tickHandler = TickBus.Connect(self);   
end

function gamestart:OnTick(deltaTime, timePoint)
    if (self.tickHandler ~= nil) then
        self:SetControls("PlayerCharacter", "EnableControlsEvent", 0);
        self.tickHandler:Disconnect();
        self.tickHandler = nil;
    end
end

function gamestart:OnDeactivate()
    if (self.clickHandler) then
        self.clickHandler:Disconnect();
        self.clickHandler = nil;
    end
end

function gamestart:OnEventBegin(value)
    if (GameplayNotificationBus.GetCurrentBusId() == self.clickEventId) then
        self:SetControls("PlayerCharacter", "EnableControlsEvent", 1);
        UiCanvasAssetRefBus.Event.UnloadCanvas(self.entityId);
        if (self.tickHandler ~= nil) then
            self.tickHandler:Disconnect();
            self.tickHandler = nil;
        end
    end
end

function gamestart:SetControls(tag, event, enabled)
    local entity = TagGlobalRequestBus.Event.RequestTaggedEntities(Crc32(tag));
    local controlsEventId = GameplayNotificationId(entity, event, "float");
    GameplayNotificationBus.Event.OnEventBegin(controlsEventId, enabled);
end

return gamestart

文字の削除

まずは、文字消去だけを解説していきます。

gamestart.lua
function gamestart:OnActivate()
    self.clickEventId = GameplayNotificationId(self.entityId, "ClickEvent", "float");
    self.clickHandler = GameplayNotificationBus.Connect(self, self.clickEventId);   
    self.tickHandler = TickBus.Connect(self);   
end

OnActivateでClickEventの通知バスに接続します。
ClickEventは前回のイベントバスで実装した部分になります。

gamestart.lua
function gamestart:OnEventBegin(value)
    if (GameplayNotificationBus.GetCurrentBusId() == self.clickEventId) then
        self:SetControls("PlayerCharacter", "EnableControlsEvent", 1);
        UiCanvasAssetRefBus.Event.UnloadCanvas(self.entityId);
        if (self.tickHandler ~= nil) then
            self.tickHandler:Disconnect();
            self.tickHandler = nil;
        end
    end
end

OnEventBeginにてClickEventのイベントが動作したかチェックした後、UnluadCanvasで自身に付いているキャンバスを削除します。
これで文字の削除ができるようになります。

gamestart.lua
function gamestart:OnDeactivate()
    if (self.clickHandler) then
        self.clickHandler:Disconnect();
        self.clickHandler = nil;
    end
end

通知バスはエンティティの終了部分で消しておきます。

キャラクターの停止

文字は消せるようになりましたが、
これだけではスタートの文字が表示中に
キャラクターが操作できてしまいます。
ゲームが始まるまでキャラクターの停止をさせる処理を解説します。

gamestart.lua
function gamestart:OnActivate()
    self.clickEventId = GameplayNotificationId(self.entityId, "ClickEvent", "float");
    self.clickHandler = GameplayNotificationBus.Connect(self, self.clickEventId);   
    self.tickHandler = TickBus.Connect(self);   
end

OnActivateでTickBusの通知バスに接続します。
TickBusは毎フレーム処理させる動作を実装する時に役立ちます。
今回はジャンプの処理の有効化フラグなどがキャラクターのスクリプトのOnActiveに使用されているため、キャラクターの停止処理のタイミングをずらすために使用します。

gamestart.lua
function gamestart:OnTick(deltaTime, timePoint)
    if (self.tickHandler ~= nil) then
        self:SetControls("PlayerCharacter", "EnableControlsEvent", 0);
        self.tickHandler:Disconnect();
        self.tickHandler = nil;
    end
end

OnTickは毎フレーム呼ばれます。
ここではキャラクター(スライス)のアクティブフラグをSetControlsにて停止させています。
OnTickはキャラクターを停止させたら不要なのでtickのバスは切ります。

gamestart.lua
function gamestart:SetControls(tag, event, enabled)
    local entity = TagGlobalRequestBus.Event.RequestTaggedEntities(Crc32(tag));
    local controlsEventId = GameplayNotificationId(entity, event, "float");
    GameplayNotificationBus.Event.OnEventBegin(controlsEventId, enabled);
end

SetControlsでは引数で渡されたタグ名の付いているエンティティの有効無効を切り替えを行います。

gamestart.lua
function gamestart:OnEventBegin(value)
    if (GameplayNotificationBus.GetCurrentBusId() == self.clickEventId) then
        self:SetControls("PlayerCharacter", "EnableControlsEvent", 1);
        UiCanvasAssetRefBus.Event.UnloadCanvas(self.entityId);
        if (self.tickHandler ~= nil) then
            self.tickHandler:Disconnect();
            self.tickHandler = nil;
        end
    end
end

OnEventBeginにてClickEventのイベントが動作したかチェックした後、キャラクターの有効化をします。
念のためココでもtickのバスは切る処理を入れます。

まとめ

これでキャラクターの停止と文字の削除が出来ました。
キャラクターの停止と同じ要領でカメラの停止も出来ると思います。
次回は衝突判定を行っていきます。