code VR

Unity×VR(176)

スポンサーリンク

//tips

//微調整

ゴーレムの挙動修正部分を確認する。先のコードを使用したところフリーズしてしまった。whileから脱出できなくなった。

if (animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"))
{
rightfootcollider.enabled = true;
Debug.Log("rightfootcollider.enabled = true");
}

上記にに変更してみると、無事に動作は確認できるようになった。

ただ、パンチモーション以外でもダメージは発生しており、コライダーチェックが入っていない状態またはほんの一瞬入ることでダメージを与えているよう。

また、プレイヤーがいない場合でもパンチモーションを行なってしまうようになった。これはif (punchflag == false && onchase == true)に原因があり、onchase = falseの実行がコルーチン内のメソッドでうまくいっていないようなので下記のように追加修正した。

while (!animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"))
{
rightfootcollider.enabled = false;
punchflag = false;
onchase = false;
yield return null;
}

Udpdateでは、wait状況から移行しているが、コルーチンではモーションの実行が続いているときに、walkとpunchモーションが同時に重なり、タイミングにずれが生じていそう。elapsedTimeをうまく調整してこの重なりを起こさないように試す。

if (elapsedTime > waitTime)
{
//Debug.Log("Waittime");
navMeshAgent.speed = 3.5f;
navMeshAgent.acceleration = 8;
SetState(EnemyState.Walk);
animator.SetBool("Walk Forward", true);

elapsedTime = 1.5f;に変更。

実行してみるとパンチモーションanimator.SetBool("PunchAttackB", true)が行われなくなり、下記のデバッグも見られなかった。

if (animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"))
{
rightfootcollider.enabled = true;
Debug.Log("rightfootcollider.enabled = true");
}

while (!animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"))
{
rightfootcollider.enabled = false;
punchflag = false;
onchase = false;
yield return null;
}

パンチのアニメーションクリップについていたfixeddurationを0にしてすぐに遷移させるように変更。

なぜかパンチアクションが実行されなくなり要因を探していたら変更する時間はelapsedTimeではなくwaitTimeの方であることに気づいた。if (elapsedTime > waitTime)でelapsedTimeが常にwaitTimeより大きかったのですぐにwalkアクションに遷移してしまっていた。

waitTimeを3.5にすることによりかなり改善された。パンチモーションが出るようになり、パンチモーション中に当たり判定ができるようになった。

だが、歩いているときにまだ反応が出る。また、chase中からwaitへの遷移が甘かったように感じたので、chaseコードの中にも距離を条件にwaitに移行するコードを追加した。

if (state == EnemyState.Chase)
{
if (navMeshAgent.pathStatus != NavMeshPathStatus.PathInvalid)
{
if (playerTransform.position != null)
{
setPosition.SetDestination(playerTransform.position);
navMeshAgent.SetDestination(setPosition.GetDestination());
onchase = true;

if (Vector3.Distance(transform.position, setPosition.GetDestination()) < 1.5f)
{
SetState(EnemyState.Wait);
}
}
}

これで実行して確認してみたところ2つの問題が確認できた。

1つ目は、至近距離でもwait状態に移行せずwalkを続ける場合がある

2つ目は、到着地点で攻撃を続けること

至近距離になった場合でもターゲット設定ができない場合があることはゴーレムの子要素にあるサーチ用のコライダーがうまく機能していない恐れがあるので、SearchCharacterスクリプトを確認していく。

OnTriggerStay(Collider col)で別のオブジェクトを取得している可能性があるので、デバッグでそちらを確認する。

確認すると確かにテラインも接触反応に含まれてしまっていたがプレイヤーもきちんと認識していたのでサーチエリアの方は問題なさそう。

Wait状態にあるにもかかわらずUpdate()によりひたすらanimator.SetBool("Walk Forward", true);が呼ばれているのが問題。

各インスペクターのwaittimeも再設定し、デバッグも設定しておく。

これによりupdateメソッドの中身であるif (state == EnemyState.Walk || state == EnemyState.Chase)とelse if (state == EnemyState.Wait)が同時に呼ばれていることがわかり、state設定の仕組みに問題があることがわかった。

State管理の見直しを行なっていく。

人気の記事

1

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、ANAが、定額全国住み放題サービスを提供する「ADDress」と組んで、国内線を4回まで定額利用可能 ...

2

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

3

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

4

ついに、noteの月間アクティブユーザー数が4400万人(2020年3月時点)に到達しました。 そもそも、「note」とは、クリエイターが、文章やマンガ、写真、音声を投稿することができ、ユーザーはその ...

5

ボードゲームカフェが1日2回転で儲かるという記事をみつけたので興味を持ち、調べてみました。 まずは、需要がどれくらいあるのか、市場のようすからみていきましょう。 世界最大のボードゲーム市場はドイツで、 ...

-code, VR
-,

Copyright© BUSINESS HUNTER , 2023 All Rights Reserved Powered by AFFINGER5.