Day 17 - Motion
昨日はGitHubにUnityのプロジェクトがプッシュ出来るようになりました。 今日は、新しいゲーム制作に入る前にちょっとやりたい事があるのでそれについて書きます。 What is fun of the game? プレイヤー視点から見たゲームに置いて重要な要素、というのは様々な物があります。 操作性が良かったり、シナリオが感動的だったり。 その中でも僕が重要な要素だと思うのが、 プレイしていて楽しいかどうか だと思います。 まあ、そのプレイしていて楽しいかを構成している要素っていうのもまたまた出てきてどんどん分岐して行くのですが… ...
昨日はGitHubにUnityのプロジェクトがプッシュ出来るようになりました。 今日は、新しいゲーム制作に入る前にちょっとやりたい事があるのでそれについて書きます。
What is fun of the game?
プレイヤー視点から見たゲームに置いて重要な要素、というのは様々な物があります。 操作性が良かったり、シナリオが感動的だったり。
その中でも僕が重要な要素だと思うのが、プレイしていて楽しいかどうかだと思います。 まあ、そのプレイしていて楽しいかを構成している要素っていうのもまたまた出てきてどんどん分岐して行くのですが…
今まで僕のプレイしたPRGゲームで、プレイしていて面白い!と思ったものの特徴を上げてみると 上から「モーション等の見た目に拘っている」「効果音に拘っている」その上で「ゲームバランスが良い」 こんな感じの並びでRPGゲームの面白さが構成されていることがわかりました。 (個人差は勿論ありますし、競技FPS等e-Sportsで考えると優先順位は逆になったりします)
今後面白いゲームを作るためには上の三要素をふんだんに取り入れるための技術を習得しなければならない。 ならば、一番重要だと思うモーションについて勉強しようではないか。
Mecanim
Unityでアニメーションを扱うには、どうやらMecanimという機能を使うといいらしい。 少し調べてみると、人形のキャラクターに対してモーションを付ける際に便利な機能みたい。 まあ、例によって言葉で理解するより体で理解しましょう。
let's try
新しいプロジェクトを作成した後にMecanimの機能を体験するためのアセット 「Mecanim Locomotion Starter Kit」という物があるので、こちらをインポートしてやります。
インポートしたら、適当に床となるオブジェクトを作成してやります。 その後、Locomotion Setup/Locomotion/Animationsの中にあるDefaultAvatar.fbxをシーンに追加。
次に、シーンに追加したDefaultAvatarを選択して、インスペクター→AnimatorコンポーネントのControllerにLocomotionというものをアタッチしてあげます。
このアタッチしたLocomotionが「アニメーターコントローラー」と呼ばれるものみたいです。 モーションが入ってるわけではないけど「歩く時は歩きモーション」、「止まっている時は待機モーションをしろ!」という指示を設定するファイルみたいです。
このあと、歩けるようにするとか重力を適用するとか色々とやるんですが それはやったことがあるので、飛ばしてモーションについてだけまとめます。
State and Transition
Locomotion.controllerをダブルクリックすると、こんな画面が見えます。
すっごい簡単だなあ、と思うのも束の間。オレンジ色のLocomotionをダブルクリックすると
入り組んだState(アニメーターを制御する部分)とTransition(stateを切り替えてくれるヤツ)が見えます。 ここの右上のなにもない所で右クリック、Create Emptyして名前をjumpにします。
次に、Animatorウィンドウ左側のParametersタブを選択。 +からBoolを選択、New Boolの名前をis_jumpingにします。
追加したJumpという名前のStateを選択してインスペクターからMotion欄にRunJump_ToLeft_2をアタッチします。
WalkRunStateからTransitionをJumpに向けて、Jumpからも返します。
WalkRunからJumpに向けて伸びているTransitionを選択してインスペクターに表示されているものを見ます。
下のConditionsの+をクリックして先程作成したis_jumpingを選択、値はtrueに指定します。
今度は、逆に伸びているTransitionのConditionでis_jumpingを追加しこちらは値をfalseに設定します。
bool変数をどっかスクリプトで操作してそれがtrueになり次第ジャンプモーションに入って、falseになり次第歩きモーションに戻るって感じですかね?
次にDefaultAvatarにスクリプトを追加してやります。
private Animator anim; void Start () { anim = GetComponent<Animator>(); } void Update () { if(Input.GetKey(KeyCode.Space)) //スペースが押されたら { anim.SetBool("is_jumping", true); //is_jumpingはtrueになる } AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo(0); if(state.IsName("Locomotion.Jump")) { anim.SetBool("is_jumping", false); } }
スペース押されたらis_jumpingはtrueになって、それ以外の時はfalseになってます。
こちらを組み込んでゲームを実行してみると
なんだか格好つけたジャンプをするようになりました。
なるほど…ここでもBool変数が便利そうだなぁ。 何かキーを押したらモーションが呼び出されて動く。
ちなみに、アニメーションで使うbool型変数はtrueの判定から外れた場合はfalseに自動的に戻るそうです。
なるほど…この流れで適用したいモーションを指定してやると… 明日もモーションについて調べて、その次にはまた重要要素である見た目。 シェーダーについて勉強しようと思います。 今日はここまで。