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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1264閲覧

敵が移動しながらアニメーションをしてしまう

shinchan0424

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2018/12/02 07:21

前提・実現したいこと

敵のプログラムを書いています。
プレイヤーが球を投げれるのですが、その球に敵が当たった時にダメージをくらったアニメーションに遷移します。

移動のスクリプトは
Unity のナビゲーションを使用して、スタンダートアセットのAICharacterControlをそのまま使っています。

発生している問題

探索のプログラム
(マップ上に12か所のトランスフォームを設定していて、そのトランスフォームに向かうというプログラムを書いています。
一定時間でそのトランスフォームを変更することで何となく探索しているかのように見せています)

その場所に向かっている途中に球を当ててしまったら、その場所に移動しながらくらった時のアニメーションしてしまいます。

移動はせずくらったアニメーションをして欲しいです。

該当のソースコード

unity C#

ソースコード

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

namespace UnityStandardAssets.Characters.ThirdPerson
{
[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
[RequireComponent(typeof(ThirdPersonCharacter))]

public class EnemyControll : MonoBehaviour { public UnityEngine.AI.NavMeshAgent agent { get; private set; } public ThirdPersonCharacter character { get; private set; } [SerializeField] Animator enemy; private float timeleft; static public int Point = 12; int move; [SerializeField] Transform[] MovePoint = new Transform[Point]; bool MoveChange; public enum EnemyState { Search,//探索 BoxATK,//箱を攻撃 PlayerATK,//プレイヤーを攻撃 Coin,//ダイヤを拾いに行く Death,//ダメージ } public EnemyState type; private Transform target; private void Start() { agent = GetComponentInChildren<UnityEngine.AI.NavMeshAgent>(); character = GetComponent<ThirdPersonCharacter>(); agent.updateRotation = false; agent.updatePosition = true; this.type = EnemyState.Search; enemy.SetBool("Move", false); } private void Update() { Debug.Log(type); if (this.type == EnemyState.Search) { Search(); MoveChange = true; } if (this.type == EnemyState.Death) { enemy.SetTrigger("Death"); target = null; MoveChange = false; } } public void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Attack") { this.type = EnemyState.Death; } } void Search() { timeleft -= Time.deltaTime; if (timeleft <= 0.0) { timeleft = 4.0f; move = Random.Range(0, 12); } enemy.SetBool("Move", true); this.target = MovePoint[move]; if (MoveChange) { if (target != null) agent.SetDestination(target.position); if (agent.remainingDistance > agent.stoppingDistance) character.Move(agent.desiredVelocity, false, false); else character.Move(Vector3.zero, false, false); } } }

}

試したこと

アニメーションが遷移するところで、targetにnull を入れた。

移動のところをMoveChangeというBoolでturuの時に移動をする というのを書いてみました。

補足情報(FW/ツールのバージョンなど)

元も私がプログラマーではなく、つたないところが多いかもしれませんが、
回答よろしくお願いします。

質問などもなるべく早くお答えしたいと思っています。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

EnemyStateがSearchの間移動しているっぽいので、
新たにDamageを追加して、ダメージモーションが終わったらSearchに戻してやれば良さそうです

投稿2018/12/02 16:54

izmktr

総合スコア2856

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

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

shinchan0424

2018/12/03 05:14

弾が当たったとき public void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Attack") { this.type = EnemyState.Death; } こういう処理をしていて、Deathにステータスを変更しています。 そしてDeathの時にダメージのモーションをしていますが、それでも移動をしてしまいます。 ダメージをDeathとしてしまっていますが、そのステータスがダメージのステータスにしています。 わかりにくくて申し訳ありません。
izmktr

2018/12/03 10:09

移動はNavMeshAgentまかせなんですね それなら、agent.speed = 0にすれば止まると思います
shinchan0424

2018/12/04 02:36

agent.speed = 0を試してみました。 Deathのアニメーションを行うときに止まりましたが、その後動きませんでした。 ということは? と思い Searchのところで、agent.speed = 3.5f; を追加したところ動きだしましたが、 依然と同じようになってしまいました。(Deathのアニメーションの時に移動してしまう) 今現在、書き換えて if (this.type == EnemyState.Death) { enemy.SetTrigger("Death"); agent.speed = 0; this.type = EnemyState.Search; } こう書いています。(TypeがDeathの時の処理) こちらの全部の処理がUpdeteに入れてしまっているため、アニメーションが終わり切る前にTypeがSearchに行ってしまい、動いてしまっているのではないかと思いました。 この場合どのように書き直したら解決できますでしょうか? よろしくお願いします。
izmktr

2018/12/04 03:55

もうわかっていると思いますが、答えはアニメが終わるまでagent.speedを0のままにする、です ダメージのアニメ中は、EnemyState.Deathから変更しない、とか EnemyState.Searchであっても、アニメ中は3.5を入れないとか、自分の設計に応じてそういう処理にしてください
shinchan0424

2018/12/04 05:59

ありがとうございます! できました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問