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

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

ただいまの
回答率

89.20%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 438

shinchan0424

score 12

 前提・実現したいこと

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

移動のスクリプトは
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/ツールのバージョンなど)

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

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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/04 11: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に行ってしまい、動いてしまっているのではないかと思いました。

    この場合どのように書き直したら解決できますでしょうか?

    よろしくお願いします。

    キャンセル

  • 2018/12/04 12:55

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

    キャンセル

  • 2018/12/04 14:59

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

    キャンセル

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

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る