参考 : 【Unity】 Unity4.3のMecanimのアニメーションイベントの使い方
参考先に全部書いてあって補足する事もないの説明省略。
2014年5月20日火曜日
2014年5月19日月曜日
Unity : 動く床に乗ったプレイヤーを動かす
プレイヤー(操作対象)が動く床の上に載ったら、
プレイヤーを床の子オブジェクトにするという方法で実装。
(注意:子オブジェクトにするため、床オブジェクトのスケーリングがプレイヤーに適用されてしまいます。)
上に乗っている場合、という判定のために床自体の Collider とは別に
上側の面に Collider を追加した。
動く床のメインオブジェクトは MovingFloor。
MovingFloorParent は空のゲームオブジェクトで、
MovingFloor のアニメーションを相対座標で動かすために親を作っている。
空のゲームオブジェクトに Box Collider 2D (Is Trigger 有効) を付けたものを MovingFloor の子オブジェクトする(とりあえず Surface と命名)。プレイヤーと接触するよう MovingFloor よりも少しだけはみ出しておく。(全体を覆うと、下や横方向から接触した場合にもプレイヤーが動く床にくっついてしまうので、上だけ)
Surface にはプレイヤーの当たり判定で判別できるよう Tag をつけておく。
プレイヤーに付けたスクリプトの OnTriggerEnter2D で、
transform.parent が null の時に Surface に接触したら、
transform.parent = other.gameObject.transform;
としてプレイヤーを子オブジェクトにする。
transform.parent が null でない時に OnTriggerExit2D で
Surface と離れたら、
transform.parent = null;
として親子関係を切り離す。以下の様な感じ。
載った瞬間にピタっとくっつき過ぎる感じなのがちょっと微妙な気もするけど、
どうしたらいいんだろう?
プレイヤーを床の子オブジェクトにするという方法で実装。
(注意:子オブジェクトにするため、床オブジェクトのスケーリングがプレイヤーに適用されてしまいます。)
上に乗っている場合、という判定のために床自体の Collider とは別に
上側の面に Collider を追加した。
動く床のメインオブジェクトは MovingFloor。
MovingFloorParent は空のゲームオブジェクトで、
MovingFloor のアニメーションを相対座標で動かすために親を作っている。
空のゲームオブジェクトに Box Collider 2D (Is Trigger 有効) を付けたものを MovingFloor の子オブジェクトする(とりあえず Surface と命名)。プレイヤーと接触するよう MovingFloor よりも少しだけはみ出しておく。(全体を覆うと、下や横方向から接触した場合にもプレイヤーが動く床にくっついてしまうので、上だけ)
Surface にはプレイヤーの当たり判定で判別できるよう Tag をつけておく。
プレイヤーに付けたスクリプトの OnTriggerEnter2D で、
transform.parent が null の時に Surface に接触したら、
transform.parent = other.gameObject.transform;
としてプレイヤーを子オブジェクトにする。
transform.parent が null でない時に OnTriggerExit2D で
Surface と離れたら、
transform.parent = null;
として親子関係を切り離す。以下の様な感じ。
載った瞬間にピタっとくっつき過ぎる感じなのがちょっと微妙な気もするけど、
どうしたらいいんだろう?
2014年5月15日木曜日
Unity : StartCoroutine とスレッドセーフティ
未だに Coroutine の挙動がよくわかっていません。。。
ふと「StartCoroutine で作ったメソッド内で変数を弄る時ってスレッドセーフにするよう考える必要あるのかな?」と思い、ThreadId を取得してみました。
Debug.Log("ThreadId:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
void Update() 内で取得した ThreadId と、
StartCoroutine で始めた関数内で ThreadId は同じだったので、競合を考える必要はないようです。
2014年5月10日土曜日
Unity : FixedUpdate と Update の違い
Unity 公式のチュートリアルビデオ(英語) : Update and FixedUpdate
リファレンス : MonoBehaviour.FixedUpdate()
簡単にまとめると、
物理シミュレーション用のアップデート関数で、必ず一定時間毎に呼ばれる。
FixedUpdate 関数が呼ばれた後、必要な物理計算が行われる。
物理オブジェクト(RidigBody) に対して AddForce で力を加える場合等に利用する。
1フレーム(1回のUpdate)に対して複数回呼ばれる事がある。
FixedUpdate の中で Time.deltaTime を呼ぶと、Update からの経過時間ではなく fixedDeltaTime が取得できる(!)
非物理オブジェクトを Translate 等で直接移動する場合は、こちらの関数の中で Time.deltaTime を使って時間を考慮して移動する。
Time.deltaTime で得られる値は前回の Update からの経過時間。
その他参考ページ
[Unity3d] Update, OnGUI, FixedUpdate などの呼び出し順序
Unity におけるフレームと Update
以下のページは英語だけど、 Awake, Start, OnGUI, WaitFor* を使用している Coroutine等の実行タイミングも描かれたフロー図がとてもわかりやい
Unity3D MonoBehaviour Lifecycle
リファレンス : MonoBehaviour.FixedUpdate()
簡単にまとめると、
FixedUpdate
物理シミュレーション用のアップデート関数で、必ず一定時間毎に呼ばれる。
FixedUpdate 関数が呼ばれた後、必要な物理計算が行われる。
物理オブジェクト(RidigBody) に対して AddForce で力を加える場合等に利用する。
1フレーム(1回のUpdate)に対して複数回呼ばれる事がある。
FixedUpdate の中で Time.deltaTime を呼ぶと、Update からの経過時間ではなく fixedDeltaTime が取得できる(!)
Update
描画フレームのアップデートに対応した関数。一定時間毎に呼ばれるとは限らない。非物理オブジェクトを Translate 等で直接移動する場合は、こちらの関数の中で Time.deltaTime を使って時間を考慮して移動する。
Time.deltaTime で得られる値は前回の Update からの経過時間。
その他参考ページ
[Unity3d] Update, OnGUI, FixedUpdate などの呼び出し順序
Unity におけるフレームと Update
以下のページは英語だけど、 Awake, Start, OnGUI, WaitFor* を使用している Coroutine等の実行タイミングも描かれたフロー図がとてもわかりやい
Unity3D MonoBehaviour Lifecycle
2014年5月7日水曜日
Unity : Animation の Wrap Mode を PingPong に設定する
Stealth チュートリアルではまったのでメモ
WrapMode option not available in unity 4.3?
WrapMode option not available in unity 4.3?
- Warp Mode の設定がない場合は Inspector のメニュー(右の方にある下矢印+三本のライン)から Debug する
- Animation Type を 1 に設定する必要がある
Unity で Asset Store に繋がらない場合の対処法
参考:Unity Community Support -> Unity Support -> Asset Store Loading
Unity のチュートリアルを進めようと、アセットのダウンロードをしようとしたところ、
Asset Store のページは見れるものの、
個別のパッケージに進むと延々と Loading という状態になってしまいました。
公式ブログではプロキシやセキュリティについて言及していましたが、
自分の場合は上記のページを参考に、以下の手順で繋がるようになりました。
Unity のチュートリアルを進めようと、アセットのダウンロードをしようとしたところ、
Asset Store のページは見れるものの、
個別のパッケージに進むと延々と Loading という状態になってしまいました。
公式ブログではプロキシやセキュリティについて言及していましたが、
自分の場合は上記のページを参考に、以下の手順で繋がるようになりました。
- ログイン状態にする(Asset Store 右上のボタン)
- 一度 Unity を閉じて再起動する
他にも管理者権限で起動すると繋がるようになった等の事例があるそうです。
登録:
投稿 (Atom)
