Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。0Unityのゲームで、キャラクターが元気な状態なのか、疲れている状態なのかでAnimatorの状態や遷移条件はそのままに、アニメーションクリップだけを替えたい事があります。スクリプトを使えば、Animatorの歩いている状態(Walk)に設定されているアニメーションクリップを別のものに切り替える、ということでも実現出来そうです。そんな時はAnimatorでベースとなるレイヤーと、シンクロした新しいレイヤーを作成した方が簡単です。新しいレイヤーのBlendingをOverrideにし、ウエイトが0の場合は、ベースとなるレイヤー(通常状態)の状態と遷移を使い、1の場合は新しいレイヤー(疲れた状態)の状態と遷移を使う事が出来ます。スクリプトから新しいレイヤーのウエイトを操作し、Animatorの状態と遷移はそのままにアニメーションを変更する事が出来ます。スポンサーリンクキャラクターに設定したAnimatorに新しいレイヤーを作成するまずは、キャラクターに設定しているAnimatorControllerに元気な時のレイヤーを作成してみましょう。↑がキャラクターが元気な時の状態と遷移を作成したものです。アニメーションパラメータにFloat型のSpeedを作成し、Idle→WalkはSpeedがGreaterで0.1、Walk→IdleはSpeedがLessで0.1という条件で遷移するように作成します。IdleにはスタンダードアセットのEthanのIdle、WalkにはスタンダードアセットのEthanのWalkを設定し、普通に立っている、歩いているという状態になります。次にキャラクターが疲れた状態のレイヤーを作成します。↑の左上のLayersを押し、その右下の+を押します。Layerとしたら、右の歯車をクリックし、Syncにチェックを入れます。Layerに指定したレイヤーの状態と遷移がそのまま現れますが、アニメーションクリップが設定されていません。Idle、Walkにキャラクターが疲れた時用のアニメーションクリップを設定します。Layerの状態と遷移が使われるようになります。このWeightをスクリプトから操作すれば、キャラクターのアニメーションだけを切り替える事が出来ます。Layerのウエイトを操作していきます。基本のキャラクターの移動やアニメーションの遷移条件の変更等は、Unityのアニメーションの切り替えシステムとスクリプトUnityのアニメーションの切り替えシステムであるAnimatorControllerの設定とスクリプトからアニメーションを制御していきます。17:08を参考にしてください。今回のキャラクター操作スクリプトの処理を考えていきます。キャラクターを動かしている状態(移動キーを押している)が一定時間続いたら、キャラクターを疲れている状態にします。こまめに移動キーを離していれば、疲れは溜まらないとします。キャラクターが疲れた状態になっている時に、その場で一定時間じっとしていれば元気な状態に戻るようにします。疲れた状態で少しでも移動キーを押すと、回復までの経過時間がリセットされ、また最初から時間の計測をする事にします。Layerを取得し、レイヤーのウエイトをスクリプトから操作する事で切り替えます。状態を変化させた時に、いきなりウエイトをパッと切り替えてしまうと、アニメーションもいきなり変化しておかしくなるので、ウエイトは徐々に変化させていきます。疲れた状態になる時間、回復までの時間等はインスペクタで設定出来るようにします。作成するスクリプトの処理がわかったので、スクリプトを作成していきます。フィールド宣言とStartメソッドまずはフィールド宣言とStartメソッド内の初期化処理です。true);}キャラクターの状態を列挙型で作成しておきます。キャラクターは元気な時と疲れた時で歩くスピードを変化させる為、インスペクタでそれぞれのスピードを設定出来るようにします。Layerを取得する為、tiredLayerというint型のフィールドを宣言します。Layerのウエイトを操作する時に、レイヤー番号を使用する必要がある為にこのフィールドを使います。Layer”)と、レイヤー名でレイヤーのインデックス番号を取得し、代入しています。smoothFlagは徐々にウエイトを操作する時に、今ウエイトを操作しているか?という状態フラグです。キャラクターの状態を変化させた時にsmoothFlagをオンにし、ウエイトが0か1になったら(どちらの状態からどちらの状態へ変化したかで分かれる)SmoothFlagをオフにします。ちなみに、フィールド宣言で使用している[SerializeField]はそのフィールドを直列化(シリアライズ化)することの宣言です。クラス全体を直列化しデータとして保存する時には、publicなフィールドしか直列化出来ませんが、この[SerializeField]を付けておくとprivateなアクセス修飾子が付いていても直列化する事が出来ます。privateでもインスペクタで値を設定する事が出来るようになります。クラス全体の直列化に関しては、Unityでゲームデータのセーブ・ロードを行う方法Unityのゲームで進行具合やキャラクターのステータスをデータとして保存しておき、それらのデータを読みだして続きから再開するというのは必須の機能になっています。その為に今回はゲームデータのセーブとロードが出来るようにしてみたいと思います。23:19を参照してください。その他、説明していないフィールドはコメントを見て頂ければわかると思います。true);という見慣れない?記述がありますが、これはSetStateというメソッドの第2引数にはtrueというbool値を渡すという事です。:という見慣れない表記があるのは、いったい何のbool値を渡しているのか?をわかりやすくする為のC#?の記述の仕方です。現時点でSetStateを作成していないので、このfirstが何なのかもわかりづらいですが・・・・(^_^;)firstはSetStateを呼び出すのが最初かどうか?のbool値です。true);でいいんですが、何のbool値を渡しているかを解りやすくする為にfirstという文字を記述していただけです。Layerのウエイトを操作したくない為にこのフラグを使って、第2引数にtrueが渡ってきた時はウエイトを操作しないようにしています。SetStateメソッドUpdateメソッドを見る前に、キャラクターの状態を変化させるSetStateメソッドを見ていきます。tiredWalkSpeed;}}SetStateメソッドの第2引数の仮引数でfirstが宣言されていますが、firstにfalseを代入しています。これはSetStateを呼び出した時に第2引数が指定されていなければ、firstにfalseを設定するという意味です。ここら辺はC#のクラス、フィールド、メソッド、コンストラクタ、プロパティの作成C#のクラスの作成やフィールド、メソッド、コンストラクタ、プロパティについて記述しました。21:12で解説しているので参照してみてください。SetStateメソッドでは、キャラクターの状態フィールドstateを受け取った引数に変更し、firstがfalseだったらsmoothFlagをオンにし、ウエイト操作を行います。元気な状態に変更した時は、nowSpeed(現在の歩くスピード)にwalkSpeedを設定し、idleTime(じっとして動かない時間)を0にします。疲れた状態に変更した時はnowSpeedにtiredWalkSpeedを代入しています。SetStateで行っている事はキャラクターの状態の変化と、その際に必要になるフィールドの変更ですね。Layerのウエイトの操作といった事を行います。現在、元気な状態の時は疲れた状態へと遷移する為の時間(continuedWalkTime)を増やしていきます。疲れている状態の時は、回復までの経過時間(idleTime)を最初からやり直す為0を代入しています。疲れた状態へと遷移する為の時間(continuedWalkTime)を0にリセットします。現在、疲れた状態の時は回復までの経過時間(idleTime)を足していきます。元気な状態、疲れた状態でcontinuedWalkTime、idleTimeと比較し、キャラクターの状態を変更します。徐々にウエイトを変化させるsmoothFlagがオンの時は、元気な状態か疲れた状態かでウエイトを徐々に足したり引いたりして操作します。ウエイトが、それぞれ指定する値(0か1)を越えた時にsmoothFlagをオフにし、ウエイトの操作を終了します。ウエイトの操作はMathf.MoveTowardsでも出来そうですね。Layerのウエイトを変化させたweightに設定します。これでスクリプトの作成は終了です。機能が完成したので、キャラクターを動かしてレイヤーのウエイトが変化、アニメーションの変化を確認してみましょう。↑のようになりました。アニメーションの切り替えを、ウエイトを操作するだけで行う事が出来るので、疲れた状態のレイヤー、ダメージを負った時のレイヤーと切り替える事が出来ますね。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。サイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事への質問はコメント欄にお願いいたします)。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。21:43の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なTPSゲームの作成までが出来ます。Д`)シクシク...お知らせ2020/02/15個人的にUnity2019.3.1f6をインストールしました。2020/01/31個人的にUnity2020.1.0a21(アルファ版)をインストールしました。2018/08/07コメント欄へのわたくしの返信は停止しております。わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。21:41も参照してみてください。コメントの返信はありませんが、回答は記事に反映されている可能性があります。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。Unityを使った3Dゲームの作り方(かめくめ).。