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

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

ただいまの
回答率

88.92%

UnityのAnimatorControllerが難しい...

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 279

nattyu

score 2

UnityのAnimatorControllerで困っています。

現在高校で数学の教員をやっている初心者プログラマーです。
Unityで3Dの数学ゲームを作成していて、Blenderで3Dキャラを作成してUnityで動かそうと思ったのですが、AnimatorControllerの扱いが調べてもよくわからなかったので質問します。

発生している問題

ゲームを開始したらRunアニメーションがTrueで、問題の正誤によってhappy、damageアニメーションがそれぞれTrueになり、3問不正解するとWaitアニメーションがTrueになるという仕様にしたいのですが、ずっとWaitがTrueになってしまっています。
AnimatorControllerの遷移図は以下の通りです。
イメージ説明

ゲーム画面はこんな感じです。
イメージ説明

キャラクターのソースコード

作成したキャラクターを動かすためのコードは以下の通りです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour
{
    public List<GameObject> Answers = new List<GameObject>();
    List<GameObject> GeneratedAnswersList = new List<GameObject>();
    List<string> Question = new List<string>();

    public GameObject explosion;

    public Button BtnRight;
    public Button BtnLeft;
    public GameObject[] Lifes;
    public Text ScoreText;

    const int MinLane = -1;
    const int MaxLane = 1;
    const float LaneWidth = 4.0f;
    const int DefLife = 3;
    const float StunDur = 0.5f;

    CharacterController controller;
    Animator animator;

    Vector3 moveDirection = Vector3.zero;
    int targetLane;
    int life = DefLife;
    float recTime = 0.0f;

    public float gravity;
    public float speedZ;
    public float speedX;
    public float speedJump;
    public float accelerationZ;

    public Text Ques;

    string[] ad;
    string[] ques;

    int crr;
    int score = 0;

    public AudioClip crrSound;
    public AudioClip misSound;
    AudioSource AS;

    public int Life()
    {
        return life;
    }

    bool IsStun()
    {
        return recTime > 0.0f || life <= 0;
    }

    void Start()
    {
        controller = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();

        CsvLoad();

        Instantiate(Answers[0], transform.position + new Vector3(0.0f, 0.0f, 10.0f),Quaternion.identity);

        Ques.text = ques[0];

        AS = GetComponent<AudioSource>();
    }

    void Update()
    {
        if (Input.GetKeyDown("left")) GoLeft();
        if (Input.GetKeyDown("right")) GoRight();
        //if (Input.GetKeyDown("space")) Jump();

        if (IsStun())
        {
            moveDirection.x = 0.0f;
            moveDirection.z = 0.0f;
            recTime -= Time.deltaTime;
        }
        else
        {
            float acceleratedZ = moveDirection.z + (accelerationZ * Time.deltaTime);
            moveDirection.z = Mathf.Clamp(acceleratedZ, 0, speedZ);

            float ratioX = (targetLane * LaneWidth - transform.position.x) / LaneWidth;
            moveDirection.x = ratioX * speedX;
        }

        moveDirection.y -= gravity * Time.deltaTime;

        Vector3 globalDirection = transform.TransformDirection(moveDirection);
        controller.Move(globalDirection * Time.deltaTime);

        if (controller.isGrounded) moveDirection.y = 0;

        animator.SetBool("Run", moveDirection.z > 0.0f);

        ScoreText.text = " Score : " + score + " pt";

        animator.SetBool("Wait", life <= 0);
    }

    void CsvLoad()
    {
        TextAsset adTextFile = Resources.Load("text/sample", typeof(TextAsset)) as TextAsset;
        ad = adTextFile.text.Split("\n"[0]);

        ques = new string[ad.Length];

        for (int i = 0; i < ad.Length; i++)
        {
            ques[i] = ad[i].Split(","[0])[0];
            Question.Add(ques[i]);
        }
    }
    public void QuestionLoad()
    {
        int rnd = Random.Range(1, Answers.Count);

        float zpos = transform.position.z;

        string question = Question[rnd];
        Ques.text = question;

        GameObject GenerateAnswer = Answers[rnd];
        GeneratedAnswersList.Add(GenerateAnswer);

        Instantiate(GenerateAnswer, new Vector3(0.0f, 0.0f, zpos + 10.0f), Quaternion.identity);
        Answers.RemoveAt(rnd);
        Question.RemoveAt(rnd);
    }

    public void GoLeft()
    {
        if (IsStun()) return;
        if (controller.isGrounded && targetLane > MinLane) targetLane--;
    }

    public void GoRight()
    {
        if (IsStun()) return;
        if (controller.isGrounded && targetLane < MaxLane) targetLane++;
    }

    /*public void Jump()
    {
        if (IsStun()) return;
        if (controller.isGrounded)
        {
            moveDirection.y = speedJump;

            animator.SetTrigger("jump");
        }
    }*/

    void OnTriggerEnter(Collider other)
    {
        QuestionLoad();

        if (IsStun()) return;

        if (other.gameObject.tag == "mistake")
        {
            AS.PlayOneShot(misSound);
            if (score < 5) score = 0;
            else score -= 5;
            life--;
            Lifes[life].SetActive(false);
            recTime = StunDur;
            Instantiate(explosion, this.transform.position, Quaternion.identity);
            Destroy(other.gameObject);
            DestroyBombs();
            animator.SetTrigger("damage");
        }
        else if (other.gameObject.tag == "answer")
        {
            AS.PlayOneShot(crrSound);
            score += 10;
            crr++;
            if (crr % 5 == 0 && crr > 0) speedZ += 1.0f;
            animator.SetTrigger("happy");
        }
    }

    void DestroyBombs()
    {
        Destroy(GameObject.FindGameObjectWithTag("explode"), 0.5f);
        Destroy(GameObject.Find("explosion(Clone)"), 0.5f);
    }
}

補足情報

Unity2019.3.9f1
Blender2.8
Microsoft Visual Studio

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

その通りで、Animator Controller は難しいです。遷移図の設計とか最初はわけわかりません。

なので最初は Transition など消してしまって Animator.Play("State名") で直接「ステートに設定したアニメーション」を再生してしまいましょう。

アニメーションのブレンドとかがやりたくなったら、パラメータによる State Transition を勉強すればよいし、ブレンドがやりたくてもどうしても Animator Controller が難しいという場合は SimpleAnimation を使えばよいです。

趣味とか、ただ動くものが作りたいだけならそれで充分だと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/05 00:01

    ・アニメーションの長さは問題ありませんでした。
    ・Speedを1から0.1にしてみましたが変化はありませんでした。
    ・元はTriggerの設定にするつもりだったので、ループさせる必要はないです。
    何度も申し訳ありませんが、何か手立てはないでしょうか?

    キャンセル

  • 2020/07/05 01:11

    「問題ありませんでした」ってそのアニメーションの長さは実際何フレームなんですか?
    実行中にAnimatorコンポーネントが追加されたオブジェクトを選択した状態にしてAnimatorウインドウを見ていれば、どのステートが再生されているかが見えるのでそれを見てトラブルシュートしてください。

    そろそろ「情報不足の中で回答する限界」に来ているし、あれはどうなってるのか、これはどうなっているのかと手取り足取り回答するのも大変なので、一回自分で調べて「期待する挙動」と「実際の挙動」、それから「期待する挙動を期待した根拠」を並べて新しい質問を作った方がよいでしょう。

    キャンセル

  • 2020/07/05 11:41

    アニメーションの長さは20フレームで、編集画面などでは正常に動いてました。

    すみません。何度もありがとうございました。
    もう少し調べてみます。

    キャンセル

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

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

関連した質問

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