本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
今回は見えないプレイヤーに呼ばれたときに周りを見渡して探すメモです。
見えないプレイヤーに呼ばれたときに周りを見渡して探す
前回記事でホロモンが周りを見渡すことで物を発見できるようにしました。
bluebirdofoz.hatenablog.com
今回はこのアクションを利用して、ホロモンがプレイヤーに呼ばれたときに周りを見渡してプレイヤーを発見するようにします。
視界に人のオブジェクトが含まれているかの判定は以下の記事で作成したスクリプトを利用します。
bluebirdofoz.hatenablog.com
プレイヤーに呼ばれた場合、視界スクリプトにプレイヤーが検出されているか確認し、プレイヤーが検出されていなければ周りを見渡すアクションを行うスクリプトを作成しました。
・HoloMonAICenter.cs
public void RequestTurnLookPlayer()
{
p_HoloMonPurpose = new HoloMonPurpose(HoloMonPurposeType.TurnTo, HoloMonPurposeTarget.Friend);
string friendName = HoloMonFieldOfVisionSingleton.Instance.FindFriend();
if(friendName != "")
{
GameObject targetObject = Camera.main.gameObject;
HoloMonActionOption actionOption = new HoloMonActionOption(
HoloMonActionHead.LookAtTarget, targetObject, HoloMonActionTail.Nothing);
p_HoloMonActionController.ActTurnLookPlayer(targetObject, actionOption);
}
else
{
HoloMonActionOption actionOption = new HoloMonActionOption(
HoloMonActionHead.Nothing, null, HoloMonActionTail.Nothing);
p_HoloMonActionController.ActLookAround(actionOption);
}
}
視界に人の特徴を持つオブジェクトが検出された場合、それを呼びかけた人と判断して再度振り向き処理を行います。
ホロモンの行動目的とアクションを参照することで、複数のアクションを組み合わせて目的を達成します。
・HoloMonAIVisionStudy.cs
<summary>
</summary>
private void FieldOfVisionObject()
{
HoloMonFieldOfVisionObject visionObject = HoloMonFieldOfVisionSingleton.
Instance.IReadOnlyReactivePropertyHoloMonVision.Value;
bool isVision = visionObject.Vision;
HoloMonPurpose currentHolomonPurpose = p_HoloMonAI.GetCurrentPurpose();
HoloMonActionTag currentHolomonActionType = p_HoloMonAI.GetCurrentActionTag();
switch (currentHolomonPurpose.PurposeType)
{
case HoloMonPurposeType.Nothing:
case HoloMonPurposeType.LookAt:
if (isVision)
{
switch (visionObject.UnderstandType)
{
case ObjectUnderstandType.NewSpawn:
p_HoloMonAI.RequestLookingNewSpawn(visionObject.GameObject);
break;
case ObjectUnderstandType.FriendFace:
p_HoloMonAI.RequestLookingFriend(visionObject.GameObject);
break;
case ObjectUnderstandType.FriendRightHand:
break;
case ObjectUnderstandType.FriendLeftHand:
break;
case ObjectUnderstandType.Food:
break;
case ObjectUnderstandType.Shit:
break;
case ObjectUnderstandType.Attention:
p_HoloMonAI.RequestLookingAttention(visionObject.GameObject);
break;
default:
p_HoloMonAI.RequestStandby();
break;
}
}
else
{
p_HoloMonAI.RequestStandby();
break;
}
break;
case HoloMonPurposeType.LookingFor:
break;
case HoloMonPurposeType.TurnTo:
if (currentHolomonActionType == HoloMonActionTag.LookAround)
{
if (isVision)
{
switch (visionObject.UnderstandType)
{
case ObjectUnderstandType.NewSpawn:
p_HoloMonAI.RequestCheckNewSpawn(visionObject.GameObject);
break;
case ObjectUnderstandType.FriendFace:
if (currentHolomonPurpose.PurposeTarget == HoloMonPurposeTarget.Friend)
{
p_HoloMonAI.RequestTurnLookPlayer();
}
break;
default:
break;
}
}
}
break;
case HoloMonPurposeType.TrackingFor:
break;
case HoloMonPurposeType.StopWaiting:
break;
case HoloMonPurposeType.Eating:
break;
case HoloMonPurposeType.Playing:
break;
case HoloMonPurposeType.Sleeping:
break;
case HoloMonPurposeType.ShitPutout:
break;
default:
break;
}
シーンを再生して動作を確認します。
ホロモンがこちらを発見しているときに「ホロモン」と声をかけてみます。
このときはホロモンがそのままこちらを向きます。
次にホロモンがこちらを見失っているときに「ホロモン」と声をかけてみます。
ホロモンが顔を振って周りを見渡し、こちらを探します。
こちらを視界に収めて発見したときに、こちらを向いてくれました。