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

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

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

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

Unity3D

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

Q&A

解決済

1回答

271閲覧

Unityの3dアニメーションについて

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity3D

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

0グッド

0クリップ

投稿2019/05/11 18:22

編集2019/05/12 02:33

Unityで玉がジャンプして落ちて着地する3dアニメーションを作りました。

using

1using System.Collections.Generic; 2using UnityEngine; 3 4public class Animechange : MonoBehaviour { 5 6 Animator anim; 7 private Rigidbody rb; 8 private string state;//状態の管理 9 private string prevState;//前の状態の保存 10 [SerializeField] 11 Raycast raycast; 12 [SerializeField] 13 private float key;//入力の管理 14 15 16 void Start() 17 { 18 //それぞれの取得 19 anim = GetComponent<Animator>(); 20 21 22 } 23 24 void Update() 25 { 26 GetInputKey();//入力取得 27 ChangeState();//状態遷移 28 ChangeAnimation();//状態によってアニメーションを変える 29 } 30 31 private void GetInputKey() 32 { 33 34 key = 0; 35 key = Input.GetAxisRaw("Horizontal")+Input.GetAxisRaw("Vertical"); 36 37 38 } 39 40 private void ChangeState() 41 { 42 //地面にいる 43 if (raycast.hit.collider.gameObject.tag == "Floor") 44 { 45 //走っている 46 if (key !=0) 47 { 48 state = "MOVE"; 49 } 50 //着地 51 else if(prevState =="JUMP") 52 { 53 state = "LANDING"; 54 } 55 //止まってる 56 else if(key==0) 57 { 58 state = "IDLE"; 59 } 60 61 62 } 63 //空中にいるとき 64 else if (raycast.hit.collider.gameObject.tag == "Untagged") 65 { 66 67 state = "JUMP"; 68 69 } 70 71 72 } 73 74 private void ChangeAnimation() 75 { 76 //状態遷移した時だけやる 77 if (prevState != state) 78 { 79 switch (state) 80 { 81 case "JUMP": 82 anim.SetBool("isJump", true); 83 anim.SetBool("isLanding", false); 84 anim.SetBool("isMove", false); 85 anim.SetBool("isIdle", false); 86 87 88 break; 89 90 case "LANDING": 91 92 anim.SetBool("isJump", false); 93 anim.SetBool("isLanding", true); 94 anim.SetBool("isMove", false); 95 anim.SetBool("isIdle", false); 96 97 break; 98 99 case "MOVE": 100 anim.SetBool("isJump", false); 101 anim.SetBool("isLanding", false); 102 anim.SetBool("isMove", true); 103 anim.SetBool("isIdle", false); 104 105 106 107 transform.localScale = new Vector3(Mathf.Abs(gameObject.transform.localScale.x) * key, gameObject.transform.localScale.y, gameObject.transform.localScale.z); 108 109 110 break; 111 112 113 default: 114 115 anim.SetBool("isJump", false); 116 anim.SetBool("isLanding", false); 117 anim.SetBool("isMove", false); 118 anim.SetBool("isIdle", true); 119 120 break; 121 } 122 //状態を保存 123 prevState = state; 124 Debug.Log(prevState); 125 } 126 127 } 128} 129 130コード

using

1using System.Collections; 2 3public class Raycast : MonoBehaviour 4{ 5 public RaycastHit hit; 6 7 [SerializeField] 8 bool isEnable = false; 9 10 void OnDrawGizmos() 11 { 12 if (isEnable == false) 13 return;//Noactive 14 15 var scale = transform.lossyScale.x * 0.5f; 16 //Hit 17 var isHit = Physics.BoxCast(transform.position, Vector3.one * scale, Vector3.down, out hit, transform.rotation); 18 //Debug 19 if (isHit) 20 { 21 Gizmos.DrawRay(transform.position, Vector3.down * hit.distance); 22 Gizmos.DrawWireCube(transform.position + Vector3.down * hit.distance, Vector3.one * scale * 2); 23 } 24 else 25 { 26 Gizmos.DrawRay(transform.position, Vector3.down ); 27 } 28 } 29} 30コード

こう書いたのですがprevStateがJUMPの時LANDINGに行くのところがうまくいかず着地してもジャンプ中のアニメーションのままになってしまいます。どうしたらよいでしょうか

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

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

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

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

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

k.matsuda

2019/05/13 00:16 編集

stateがLANDINGに変わらないということでしょうか? さらに、MOVEやIDLEにも変わらないのでしょうか?
sakura_hana

2019/05/13 01:20 編集

ChangeStateメソッドの中の1行目(if文の外)に 「Debug.Log(raycast.hit.collider.gameObject.tag);」 とログを出し、着地の瞬間どうなっているか確認してください。 (「空中にいる」を「Untaggedとぶつかっている」と判定しているのが気になります。着地してもまだUntaggedとぶつかっているのではないかと推測します)
退会済みユーザー

退会済みユーザー

2019/05/13 23:10

デバッグは入れていましたが必要ないと思い記載しませんでした。IDLE、MOVE、JUMPへのステイト遷移はします。Untaggedとしているのはシーン上のプレイヤーの足元にCube(これにタグを付けていないのでUntaggedになっています)を置いているからです。このCubeは地面にいる状態では床より下にあるのでボックスキャストは先に床を判定するはずだと考えています。
sakura_hana

2019/05/14 04:18

分かっている情報は全て明確に出してください。k.matsudaさんも指摘していますが、具体的な問題点は 1.stateがLANDINGにならない 2.stateがLANDINGになるがアニメーションが変わらない どちらですか? 1ならChangeStateに入った時「raycast.hit.collider.gameObject.tagがFloorであり、keyが0であり、prevStateがJUMPである」場合にstateはLANDINGへと変わります。全ての条件を満たしていますか? 2ならAnimatorの設定の問題の可能性があるので、そちらを見直すかスクリーンショットを貼ってください。
退会済みユーザー

退会済みユーザー

2019/05/14 07:12

2の方です。Animator見直してみます。
guest

回答1

0

ベストアンサー

処理が重かったようです。

投稿2019/11/24 17:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問