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

コロナによる需要変化 コロナパンデミックの影響で、人々は外に出られなくなり、自宅で過ごす時間が増えました。 この自粛ムードの中、下記のようなビジネスの需要変化が引き起こされています。 【利用者減少】 ...

2

米国レストランの決済時に毎日お世話になっていた「Square」のビジネスモデルについて本日はふれていきたいと思います。 「Square」とは、ネットにつながったモバイル端末と専用のカードリーダーを用意 ...

3

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

4

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

5

ナイキのSNKRSが、なぜこれほどまでに人気なのか?調べてみました。 きっかけは米国での友達との会話。彼は自分のシューズをみせて、「これ20万円もしたんだぜ。」と語ってくれました。 あまり靴に興味がな ...

-code, VR
-,

Copyright© BUSINESS HACKER , 2021 All Rights Reserved Powered by AFFINGER5.