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

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、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.