※2018年1月18日時点の情報です
← Lumberyardに触れる(4)-インプット編 Lumberyardに触れる(最終回)-衝突判定編 →
#はじめに
今回は前回取得したイベントで文字の非表示をします。
すでに私が作成したスクリプトの解説をしていきます。
#スクリプト設定
前回のスクリプトと同様の場所に
AddComponentでスクリプトを追加します。
#スクリプト
全体。
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
##文字の削除
まずは、文字消去だけを解説していきます。
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は前回のイベントバスで実装した部分になります。
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で自身に付いているキャンバスを削除します。
これで文字の削除ができるようになります。
function gamestart:OnDeactivate()
if (self.clickHandler) then
self.clickHandler:Disconnect();
self.clickHandler = nil;
end
end
通知バスはエンティティの終了部分で消しておきます。
##キャラクターの停止
文字は消せるようになりましたが、
これだけではスタートの文字が表示中に
キャラクターが操作できてしまいます。
ゲームが始まるまでキャラクターの停止をさせる処理を解説します。
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に使用されているため、キャラクターの停止処理のタイミングをずらすために使用します。
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のバスは切ります。
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では引数で渡されたタグ名の付いているエンティティの有効無効を切り替えを行います。
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のバスは切る処理を入れます。
#まとめ
これでキャラクターの停止と文字の削除が出来ました。
キャラクターの停止と同じ要領でカメラの停止も出来ると思います。
次回は衝突判定を行っていきます。