code VR

Unity×VR(108)

スポンサーリンク

//tips

//AIモンスターへの挙動追加

キャラクターと同様にMotionを行う際にのみコライダーを有効にし、ダメージ判定を生じさせられるようにスクリプトを調整する。

EnvPlaymove4 スクリプトを参考に下記にWaitAnimationfin()スクリプトを追加する。

if (navMeshAgent.remainingDistance < 1.5f)//0.5f
{
SetState(EnemyState.Wait);
animator.SetTrigger("Punch Attack");
}

それによりコライダーのオンオフは確認できた。ただ、アニメーションの状態変化がpunch状態のままwalkに切り替わらない問題が出ているのでそちらを確認する。

Aniamtorを確認したらHasexittimeのチェックがされているにもかかわらず、Punch Attackのモーションから抜け出せなくなっている。

なぜかモーション後の遷移が連続して発生して挙動がおかしくなっている。

順を追って理解していく、まず初期時点ではSetState(EnemyState.Walk);であるため、void Update()内では、if (state == EnemyState.Walk || state == EnemyState.Chase)内部が実行され、その内容はanimator.SetBool("Walk Forward", true);となっている。

ここまでは問題ない。

if (navMeshAgent.remainingDistance < 1f)で目的地との距離が1未満の場合にSetState(EnemyState.Wait);に遷移させている。

state == EnemyState.Wait内では、目的地付近でanimator.SetTrigger("Punch Attack”);でパンチの挙動を行わせ、その際に、StartCoroutine("WaitAnimationfin”);も実行させている。その際hasexittimeで自動的にwalkforwardに遷移を返していたのだが、Waitの際はIdleの場所に状態を戻すのが妥当だと考え、ルートを変更。

また、punchflagを立てて一度のメソッド実行で一回の攻撃モーションになるようにした。

これでかなりまともになった。

次に腕のコライダーにアタッチするAttackスクリプトを作成する。

下記のスクリプトをアタッチしたところなぜか胴体が接触してもダメージ判定が出てしまっている。Searchareaオブジェクトのistriggerにも反応しているのではないかと考えたが、Debugログで確認するとanimator.SetTrigger("Punch Attack”);の実動作とStartCoroutine("WaitAnimationfin”);が噛み合っていないことが原因であることがわかった。"Punch Attack”は発生から実際のパンチまで時間の余裕がある一方でWaitAnimationfinは即座に実行しているため、歩いている段階で腕のコライダーが外れて当たり判定が出ている。

なので、WaitAnimationfin()メソッドの発動時間を遅くしてあげることで意図した形になった。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GolemAttackManager : MonoBehaviour
{
public float powerEnemy = 1; //攻撃力

HPScript hPScript;

[SerializeField]
GameObject ParentObject;

private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Player" && other.gameObject != ParentObject)
{
hPScript = other.gameObject.GetComponent<HPScript>();

hPScript.hp -= powerEnemy;

if (hPScript.hp <= 0)
{
Destroy(other.gameObject); //ゲームオブジェクトが破壊される
}
}
}

}

ゴーレムの基礎攻撃力は1だがアクションの際に多段ヒットとなってしまう現象が起きている。damageflagを作成し、punchflagと同様のタイミングで動作が行われるようにしたが効果なし。

WaitAnimationfin()メソッドの最後にyield return new WaitForSeconds(0.5f);を追加した画効果なし。

elapsedTime > waitTimeの部分が問題なのかと、elapsedTime == waitTimeに変更したが、それでも複数回発生している。

WaitAnimationfin()メソッドの中身に(!animator.IsInTransition(0) && !animator.GetCurrentAnimatorStateInfo(0).IsName("RabbitWalk3”))などの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.