Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。0今回は移動キーを押した時にユニティちゃんが床の上を移動するところまでを作成したいと思います。Controllerを使って行います。前回はプロジェクトの作成とユニティちゃんモデルパッケージのインポート、警告とエラーの修正を行いました。ユニティちゃんのRPGを作ってみよう1ープロジェクトの作成とキャラクターのインポートーユニティちゃんのRPGを作る為にまずはUnityのプロジェクトの作成とキャラクターであるユニティちゃんデータのUnityへのインポートを行っていきます。Unityを使った3Dゲームの作り方(かめくめ)ユニティちゃんの3DRPGを作っていくカテゴリです。gametukurikata.comから見ることが出来ます。最初にゲームのスクリプト等を保存するフォルダを作成します。Assetsエリア内で右クリックからCreate→Folderを選択し名前をRPGとします。これから作成していくゲームのスクリプト等はRPGフォルダ内に作成します。新しいシーンの作成シーンを作成します。シーンはゲームの一つの場面で、例えばタイトルのシーン、ワールドマップのシーン、村の中のシーン、戦闘のシーン等に分けます。RPGフォルダ内で右クリックからCreate→Folderを選択し名前をScenesとします。Scenes内で右クリックし、Create→Sceneを選択し、名前をVillageとします。Villageシーンが出来たらダブルクリックしてVillageシーンを表示します。簡易的な地面を作成ユニティちゃんを移動させるにはまず移動する地面がないと駄目なので地面を作成しておきます。Object→Planeを選択し、名前をSampleGroundとします。PlaneのインスペクタのTransformでPositionとRotationのXYZ全てを0にし、ScaleのXYZを全て10にします。これで簡易的な地面が出来上がりました。ユニティちゃんプレハブの配置ユニティちゃんの髪や顔のアニメーション設定がされているユニティちゃんのプレハブをシーン上に配置します。Assets/UnityChan/Prefabs/unitychan_dynamicをヒエラルキー上にドラッグ&ドロップします。unitychan_dynamicを選択した状態でF2キーを押して名前をUnityChanに変更します。名前は好きに変更してもいいですし、変更しなくてもかまいません。UnityChanのインスペクタのTransformでPosition、RotationのXZを全て0にし、RotationのYを180にします。PositionとRotationを0にしたのは単にわかりやすい位置と角度にする為です。カメラの位置と角度を変更するユニティちゃんの位置と角度を変えたことでGameビューでユニティちゃんが写らなくなってしまったかもしれません。そこでカメラの位置と角度を変更し正面からユニティちゃんが写るようにします。Cameraを選択しインスペクタのTransformの位置をXを0、Yを1、Zを-5とし、RotationのXYZ全てを0とします。この変更を行うとGameビューでは上のようにユニティちゃんが正面から表示されるようになりました。Controllerを作成します。アニメーターコントローラーについてはUnityのアニメーションの切り替えシステムとスクリプトUnityのアニメーションの切り替えシステムであるAnimatorControllerの設定とスクリプトからアニメーションを制御していきます。17:08も参照してください。RPGフォルダ内で右クリックからCreate→Folderを選択し、名前をAnimatorsとします。Controllerを選択し、名前をUnityChanとします。ControllerのUnityChanを選択します。アニメーションの遷移条件に使うアニメーションパラメータを作成します。Animatorウインドウの左上のParametersを押した後、+を押してFloatを選び名前をSpeedとします。State→Emptyを選択し、インスペクタで名前をIdleとします。同じようにMoveForwardを作成します。Transitionを選択しMoveForward状態を押します。同じようにMoveForwardからIdleへの遷移を作成します。Idle状態を選択しインスペクタのMotionにWAIT00のアニメーションクリップを設定します。歩き状態と走る状態はアニメーションパラメータのSpeedの値によって変更します。Treeを利用するとSpeedの値によってモーションを変化させることが出来るので便利です。Stateを選択し、その後MoveForward状態をダブルクリックします。Motionを選択します。その後もう一度同じ事をしてモーションを二つにします。Treeを選択してインスペクタのモーションを設定します。Thresholdのチェックを外し、Walk00_FのThresholdは0.1、Run00_FのThresholdは0.5にします。これでアニメーションパラメータのSpeedの値が0.1の辺りはWalk00_Fのアニメーションで0.1から0.5まではWalk00_FとRun00_Fのブレンドのアニメーション、0.5以降はRun00_Fのアニメーションとなります。Layerを押して戻ります。Timeのチェックを外しSpeedがGreaterで0.1の時にMoveForwardへ遷移するようにします。Timeのチェックを外しSpeedがLessで0.1の時にIdleへ遷移するようにします。Stateを設定します。Stateを設定するとMoveForward→Idleへの遷移途中にIdle→MoveForwardの遷移条件が成立した時に割り込みが発生し、直ぐに遷移します。Sourceの設定等を見ていきます。アニメーションの遷移途中で中断し次の状態へとうまく移行させる為のサンプルも作成します。21:40を参照してみてください。Layerは顔のみのアニメーションを適用するレイヤーにします。maskを設定します。maskアバターマスクは顔だけアニメーションを適用する為に設定しています。maskはユニティちゃんパッケージに既にあるのでそれを設定するだけです。Layerには顔用のアニメーション状態を作成しておき、スクリプトから顔のアニメーションを変化させることが出来ますが、現時点では何も設定しません。これでユニティちゃんのアニメーターコントローラーが出来たので、ヒエラルキー上のUnityChanゲームオブジェクトを選択し、インスペクタのAnimatorにUnityChanアニメーターコントローラーをドラッグ&ドロップします。Motionのチェックを外し、アニメーションの変化でキャラクターが移動しないようにします。ComponentからPhysics→CharacterControllerを選択し取り付けます。CharacterControllerは衝突をするコライダと移動機能を持っています。CharacterControllerの設定を変更しユニティちゃんの衝突範囲を変更します。CenterのYを0.8、Radiusを0.3、Heightを1.4とします。シーンビューでユニティちゃんの回りに緑色のコライダの範囲が表示されました。このコライダが他のゲームオブジェクトとの衝突判定に使われます。これでコライダと移動機能の取り付けが完了しました。キャラクター操作スクリプトの作成AnimatorControllerの作成と取り付け、CharacterControllerの取り付けが終わったので、後はスクリプトからCharacterControllerの移動機能を使って移動させ、アニメーターコントローラーのアニメーションパラメータのSpeedの値を操作してアニメーションの遷移をさせるだけです。RPGフォルダ内で右クリックからCreate→Folderを選択し名前をScriptsとします。Scriptを選択し、名前をUnityChanScriptとします。UnityChanScriptをヒエラルキー上のUnityChanゲームオブジェクトにドラッグ&ドロップし取り付けます。Stadioでスクリプトを開きます。以下のスクリプトをUnityChanScript内に記述します。Time.deltaTime);}}CharacterControllerとAnimatorを入れておくcharacterControllerとanimatorフィールド、キャラクターの速度を入れておくVector3型のvelocity、歩くスピードを入れるwalkSpeedと走るスピードを入れるrunSpeedを宣言します。walkSpeedとrunSpeedには[SerializeField]アトリビュートを取り付けインスペクタで値を設定出来るようにします。Startメソッドはゲームオブジェクトが最初に登場した時に1回だけ呼ばれるのでここでCharacterControllerとAnimatorコンポーネントをGetComponentを使って取得しておきます。Updateメソッドは1秒間に何十回も呼ばれるメソッドでパソコンの処理能力に応じて呼ばれる回数が異なります。characterController.IsGroundedでキャラクターが接地しているかどうかがわかるので接地していた時は速度であるvelocityにVector3.zeroを入れて速度を0にしています。Input.GetAxis(“Horizontal”)で横軸の入力、Input.GetAxis(“Vertical”)で縦軸の入力が得られるので、その値をinputに代入しています。input.magnitudeで入力(ベクトル)の長さが得られるので0.1より大きい時に入力がされていると判断することにします。transform.LookAtは引数で指定したベクトルの方向を向かせるメソッドでtransform.positionでキャラクターの位置を得て、それにinput.normalizedで入力の単位ベクトル(長さが1のベクトルで方向を得る)を足すことで現在の位置に入力した方向を足して、その方向を向かせるようにします。input.magnitude)でアニメーションパラメータのSpeedの値にinput.magnitudeの値を渡します。input.magnitudeは入力の方向の長さが入っているので、例えば何も移動キーを押していなければ0、完全に右方向キーを押していれば1の値、ちょっとだけ右方向を押していれば0.1等の値、上と右のキーを同時に押していれば1以上の値が入ってきます。0f)でアニメーションパラメータを0にしてIdle状態へと遷移するようにします。Settings→Physicsで設定されている値)でY軸方向に重力値を足しています。デフォルトでは-9.81が設定されていてそれにTime.deltaTimeを掛ける事で重力加速度を計算しています。ここら辺はUnityで間違った重力の計算をしているかも!?Unityのキャラクター等に重力を働かせる事は多いですが、重力を働かせる処理が実は間違っているかもしれません。20:39を参照してください。その後characterControllerのMoveメソッドの引数に速度を渡してキャラクターを移動させています。ユニティちゃんを動かしてみるAnimatorControllerの作成と設定、CharacterControllerの取り付け、キャラクターの操作スクリプトの作成と取り付けが終わったのでユニティちゃんを移動させてみます。Completelyを選択します。UnityChanはunitychan_dynamicプレハブから作成したインスタンスで元のプレハブとリンクされています。UnityChanに施した変更をプレハブに反映することもプレハブの設定に戻すことも出来てしまいます。Completelyを選択する事で元のプレハブとのリンクを切り離すことが出来ます。Changerコンポーネントの右側の歯車からRemoveを選択し削除します。Handコンポーネントも削除します。次にRandomWindスクリプトとFaceUpdateスクリプトのOnGUIメソッドをコメントにします。GUILayout.EndArea();//}RandomWindスクリプトはユニティちゃんの髪を揺らすスクリプトで、FaceUpdateは顔のアニメーションを変化させるスクリプトで両方とも使用しますが、OnGUIメソッドがあるとボタンが表示されそれで簡易的に切り替えることが出来てしまうのでそれらをコメントにしました。これで設定が完了したのでUnityの実行ボタンを押して確認してみます。ユニティちゃんを動かすと上のようになりました。キーボードの矢印キーの移動だとinput.magnitudeは直ぐに1になってしまう為に歩きのモーションがほとんど確認出来ません。途中でPS3コントローラーをパソコンに繋いでアナログスティックの入力を微妙に変化させて歩きのモーションを確認しました。PS3コントローラー等でキャラクターを操作する機能は後の記事で作成します。終わりに今回は移動キーを押したらユニティちゃんが移動するという基本的なところを作成しました。元々のユニティちゃんプレハブに顔のアニメーション変化スクリプトや髪の毛を揺らしたりするスクリプトはそのまま使う為に残してあります。アニメーターコントローラーは自分で作成した方がわかりやすいかなと思ってそうしています。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。サイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事への質問はコメント欄にお願いいたします)。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。Д`)シクシク...お知らせ2020/01/18個人的にUnity2019.2.18f1をインストールしました。2020/01/01あけましておめでとうございます。(^^)/ユニティちゃんのRPGを作ってみようのPartyStatusスクリプトでpartyMembersのListの型がCharacterStatusとなっていたのでAllyStatusに変更しました。変更したというか、元々AllyStatusに書き換える前のスクリプトを掲載していたので修正しました。ユニティちゃんのRPGを作ってみよう10ーコマンド画面の作成とステータスの表示ーユニティちゃんのRPGでコマンド画面の作成とステータスコマンドを作成し、選択したキャラクターのステータスを表示するようにしていきます。20:00GetPartyStatusメソッドの戻り値もそれに伴って変更しています。2018/08/07コメント欄へのわたくしの返信は停止しております。わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。21:41も参照してみてください。コメントの返信はありませんが、回答は記事に反映されている可能性があります。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。Unityを使った3Dゲームの作り方(かめくめ).。