kidoOooOoooOOom

ゲーム開発やってます

UnityのAnimator機能チュートリアル

Unity本を見ながらMecanimのAnimator機能を触ってみた。まずはRaw Mocap Data For MechanimをAssets storeからDL。
このアセットにはサンプルのモーションがいくつか入っているので、これを導入するだけでそれっぽいアニメーションを作れることができる。
Animatorを使うには、[Windows]-[Animator]を選択。
このままでは何も表示されないので、Project ViewのLocomotion SetUp からLocomotionを選択するとサンプルのアニメーションステートマシンが表示される。

Stateを繋げている矢印がTransitionで、遷移条件や遷移の速度を編集することができる。
例えば、Idle状態からWalkRun状態へのTransitionで、Conditionsに

  • Spped > 0.5
  • Direction > -30
  • Direction < 30

と設定されていた場合、Idle状態のときにSpeedが0.5より出てかつ移動しようとしている方向が±30°の範囲内であればWalkRunに遷移するといった流れである。
ではここで、Spaceボタンを押したらJump状態に遷移するというアニメーションを作る。
まず画面上でパラメータを追加し、パラメータのタイプはBool、初期値はfalseとする。
次にAnimatorWindows上で右クリックして空のStateを作成する。そのStateにジャンプのMotionをひも付ける。
JunpのStateができたら、WalkRun上からJumpへTransitionを引いて、逆のTransitionもひく。WalkRunからJumpへのTransitionの条件として、Jump == trueを追加する。
これで、AnimatorのJumpパラメータがtrueになった場合にWarlRunからJumpへ遷移することが可能になった。
次に、実際にアニメーションをするキャラクターにScriptを追加し、Spaceボタンが押されたら JumpフラグをONにして、それ以外だったらfalseに戻すという処理を書く。

function Update () {

	var animator = GetComponent(Animator);
	
	if(Input.GetKey(KeyCode.Space)){
		animator.SetBool("Jump", true);
	}
	
	var state : AnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0);
	
	if(state.IsName("Locomotion.Jump"))
	{
		animator.SetBool("Jump", false);
	}
}

これでキャラクターにジャンプアニメーションが追加された。
もっと早いタイミングでジャンプさせたいといった調整は、Transitionの中のアニメーションブレンドにおいて実行できる。

以上でUnity4入門読了。次はUnityでゲーム作る本を進めていきます。

Unity4入門 最新開発環境による簡単3Dゲーム制作

Unity4入門 最新開発環境による簡単3Dゲーム制作

ドラクエスーパーライト


子供の面倒を見る合間にちょろちょろプレイ。AIで自動戦闘は嬉しいけれど、集中して攻撃しない点がアホ。
ガチャで直接モンスターが手に入るのではなく、あくまでも宝の地図からモンスターを見つけて仲間にしましたという見せ方になっている。既存のドラクエユーザに対しての配慮だろうか。ガチャで直接モンスター入手だと悪印象になりそうだし。
ゲームを進めるにつれて要素が追加されている仕組みも用意されているのが良い。結局は既存のカードゲームのようにメタルスライムとか手に入れて経験値を吸わせる仕組みがあったのだけれども、冒険でも手に入る仕様なのが好印象。クエストのモチベーションとしては、プレイヤーのレベルじゃなくてモンスターのレベルを上げていきたいと感じるからね。
パワーアップの仕組みはもっと後の紹介でもいいと感じた。かなりやり込み向けの要素なので。普通のストーリーだけプレイするユーザにとっては、あまり使われない機能じゃないかな?バハムートの進化と同じように、廃人にとって時間を注げる機能を用意するのも大事だと感じた。

SQLアンチパターンのラウンディングエラー(丸め誤差)

今日たまたまFLOAT型のカラムを見かけてしまったので、これはアンチパターンだったはずとハッとしながら思い出してメモっておくことにした。
FLOAT型を使うと問題なる点としては、2進数では小数点の表現に限界があるため丸められてしまい誤差が起きてしまうという点。
これにより、SQLでSUM関数を使ったときに 0.X(丸め誤差が存在する小数) の値が10個存在した場合に単純に 0.X * 10という値にはならず、別のX.0000Yのような値になってしまう恐れがある。
また、WHERE句で COLUMN = 0.X のような条件式を書いた場合においても、0.Xで格納したはずのデータが内部では 0.X00000Yのような値になっており等価性を保てない場合がある。
これはNUMERIC型やDECIMAL型を使えば回避できるが、そもそもFLOATを使わないで済むのが一番良い方法。