code VR

Unity×VR(99)

スポンサーリンク

//tips

//eventtriggerを使用したダメージ判定

アタックモーション時にisTriggerをつけたコライダーをオンにすることでダメージを相手に与える。

Rabbitの右足にコライダーを設置し、足のアタックモーションにあったコライダーの位置調整を行う。

HPスクリプトの下記のように受けて側で接触感知を行おうと考えたが、攻撃手段が増えると全てのパターンの接触反応を受けて側に記述しなければいけないことになるので、攻撃側での接触感知の方法を考えていく。

private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Weapon")
{
Debug.Log("hit Player");

Debug.Log("hit Damage");
hp -= other.gameObject.GetComponent<rodManager>().powerEnemy;

//hp -= other.gameObject.GetComponent<rodManager>().powerEnemy;
}

//体力が0以下になった時{}内の処理が行われる
if (hp <= 0)
{
Destroy(gameObject); //ゲームオブジェクトが破壊される
}
}

修正した下記をRabbit本体にアタッチし、右足にアタッチしたEventTriggerコンポーネントにPointerEnter型の接触感知をさせ、感知した場合にOnTriggerEnterメソッドを行わせる。
※EventTriggerコンポーネントは間違い

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

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

HPScriptE hPScriptE;

[SerializeField]
GameObject ParentObject;

Public void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Player"&& other.gameObject != ParentObject)
{
hPScriptE = other.gameObject.GetComponent<HPScriptE>();

hPScriptE.hp -= powerEnemy;

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

次にEnvPlaymove4スクリプト に挿入したAttackmotionメソッドで右足のコライダーの表示/非表示の切り替えを行う。アニメーションの開始地点と終了地点でコライダーの切り替えを行いたいのでコルーチンを使用し、アクション開始時にコンポーネントをオンにし、アクションを終了する際にオフにするコードを追加した。

public void Attackmotion()
{
animator.SetTrigger("Attack1");
StartCoroutine("WaitAnimationfin");
}

IEnumerator WaitAnimationfin()
{
rightfootcollider = GetComponent<Collider>();
rightfootcollider.enabled = true;

var state = animator.GetCurrentAnimatorStateInfo(0);
yield return new WaitWhile(() => state.IsName("bk_rh_right_A"));

rightfootcollider.enabled = false;
}

こうするとRabbitオブジェクト自体が自由落下してしまい、rightfootcolliderの取得コンポーネントがきちんと足になっていなかったのでCollider rightfootcollider = rightfoot.GetComponent<Collider>();として設定しなおした。

一旦decoyに対してダメージを与えてみる。decoyスクリプトにhpの記述をしているのでそちらに参照を一部変更。そして、足にアタッチしているコライダーはオフにしておく。

なぜか足のコライダーコンポーネントがオンにならないので色々と模索していたら、ボタン連打したらオンになった。これはアクション動作が早すぎるためオンオフ動作が一瞬となり表示が読み込まれる前に非表示処理の段階に移っているしまっているのかもしれない。

まずコライダーのチェックをオンにしたままアクションさせてみたがこれでも機能しない。ここで、OnTriggerEnterとeventtriggerを混同していることに気づく。

3dのコライダーのistriggerの接触を感知する場合は、OnTriggerEnter関数を使用する。2dのマウスボタンの位置などに反応させるeventtriggerとは全く異なる。

Rabbitattackmanagerを足オブジェクトに移動させ、private void OnTriggerEnter(Collider other)を足の領域に入ることで発動させるようにした。

アニメーションの遷移時間にはyield return new WaitForSeconds(1);を利用して攻撃判定の残存時間を長くすることで、コライダーのオンオフも確認できた。

一回の攻撃で2度のダメージが入っているのでそこも修正する。

人気の記事

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.