質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

248閲覧

弾丸によるダメージで体力が0になったらアニメーションを途中で終了しオブジェクトをフリーにしたい場合について。

urusu2019

総合スコア19

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2018/12/29 16:32

画像の中央にある柱状のオブジェクトはアニメーションが終了した状態です。左のオブジェクトから弾丸が発射され衝突してもその場から移動しません。
アニメーションを途中で終了し当たり判定を保持したままオブジェクトをフリー(衝突すると飛んでいく状態)にする事は可能なのでしょうか?
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アニメーションが終わったらAnimatorを切ってしまい、アニメーションによる制御を受けないようにするというのはどうでしょうか?

Animatorを無効化するメソッドを持つスクリプトを...

C#

1using UnityEngine; 2 3public class AnimationDisabler : MonoBehaviour 4{ 5 public void DisableAnimation() 6 { 7 var animator = this.GetComponent<Animator>(); 8 if (animator == null) 9 { 10 return; 11 } 12 13 animator.enabled = false; 14 } 15}

Animatorを持つオブジェクトと同じオブジェクトにアタッチし...
インスペクタ

アニメーションの末尾にアニメーションイベントを仕込み、無効化メソッドを実行させるようにすると...
アニメーション

下図のような動きにできないでしょうか。
結果

#追記
求められているのは、アニメーション終了時ではなくダメージ蓄積によるアニメーション無効化でしたね...
タイトルに記載いただいたのに失念してしまいました。すみません...

アニメーション中での任意の位置でアニメーションが無効化されうるなら、アニメーションイベントを使う必要はなさそうですね。単純に下記のような形でどうでしょう。

C#

1using UnityEngine; 2 3public class Bar : MonoBehaviour 4{ 5 public int Health = 10; 6 public int MaximumHealth = 10; 7 8 private void OnCollisionEnter(Collision collision) 9 { 10 this.Damage(1); 11 } 12 13 public void Damage(int value) 14 { 15 this.Health = Mathf.Clamp(this.Health - value, 0, this.MaximumHealth); 16 17 // ダメージ表現 18 var ratio = (float)this.Health / this.MaximumHealth; 19 this.GetComponent<Renderer>().material.color = new Color(1.0f, ratio, ratio); 20 21 if (this.Health > 0) 22 { 23 return; 24 } 25 26 var animator = this.GetComponent<Animator>(); 27 if (animator == null) 28 { 29 return; 30 } 31 32 animator.enabled = false; 33 } 34}

結果

投稿2018/12/29 23:24

編集2018/12/30 04:55
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urusu2019

2018/12/30 15:37

回答ありがとうございます。 なんとかアニメーションを切れるようになりました。 もし、弾丸を受け続けアニメーション途中に体力が0になり、アニメーションを切り、飛んでいくとなった場合、下記のようになるのでしょうか? public class Health2 : MonoBehaviour { public const int maxHealth = 10; public int currentHealth = maxHealth; public void TakeDamage(int amount) { currentHealth -= amount; if (currentHealth <= 0) { var animator = this.GetComponent<Animator>(); if (animator == null) { return; } animator.enabled = false; } } }
Bongo

2018/12/30 16:02

そうですね。見た感じですと、おそらくそれでいけると思います。
urusu2019

2019/01/01 10:12

すみません。追記に気づきませんでした。 攻撃のコードは下記ですが、ダメージを当たえても体力が0になっていないのかアニメーションが最後まで再生されてからオブジェクトが解放される感じになっています。 攻撃のコードがおかしいのでしょうか? using UnityEngine; using System.Collections; public class Bullet : MonoBehaviour { void OnCollisionEnter(Collision collision) { var hit = collision.gameObject; var health = hit.GetComponent<Health>(); if (health != null) { health.TakeDamage(10); } } }
Bongo

2019/01/01 10:27

コンポーネント名は合っていますでしょうか(「Health2」と「Health」のどちらでしょうか)?
urusu2019

2019/01/01 23:52

ご連絡ありがとうございます。 追記で教えて頂いたBarのコードです。
Bongo

2019/01/02 20:38

お返事遅くなりました。いくつかおうかがいしますが... ・柱オブジェクトにアタッチされているスクリプトは何でしょうか。回答の追記として例示しました「Bar」と、もしかして前半に例示しました「AnimationDisabler」もまだアタッチされているでしょうか? ・回答前半で言及しました、柱オブジェクト用のアニメーションクリップのアニメーションイベントは削除済みでしょうか? ・回答で例示したコードでは柱オブジェクト側で衝突検出していますが、ご質問者さんの場合は、コメントに記載いただいた「Bullet」を見ますと、弾側で衝突検出して柱側のダメージメソッドを実行する設計のご様子です。それは現在もその状態でしょうか(つまり弾側にはまだBulletがアタッチされていて、現在の状態で実行したときにも特にエラーメッセージは出ない状態でしょうか)?
urusu2019

2019/01/03 02:49

ご連絡ありがとうございます。 どういった関係なのか分かりませんがHealthとMaximumHealthの値を変えたら途中解除成功しました。 今回から新モデルを使った結果、オブジェクトの移動遅延は無くなりました。 また、今回のアニメーションカットと同じように他のコンポーネントや、中の各項目の削除をしたい場合、CS1061エラーで他のメソッドを選択する必要があるようなので別に質問させて下さい。 長々とすみません。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問