Unity Memo

Unity開発のメモ。

HingeJoint2Dの設定
PrefabをC#からインスタンス生成し、HingeJointをAddComponentする際、タップした位置をヒンジの始点にしたい場合などは、1つ目のチェーンの輪っかをその場所で固定したくなる。
Rigidbody2DのIs Kinematicをtrueにしても固定できるが、これだと下に別オブジェクトがぶら下がっていても1つ目のチェーンの輪っかは回転もしなくなる。この場合はHingeJoint2DのConectedAnchorにタップ座標を指定すれば、そこが支点となって期待通りの場所に1つ目の輪っかを置ける。

また、HingeJointでチェーンを作るとき、チェーン同士を絡めたくない場合は、Box Colider 2Dを指定しなければいい。

2D平面上でのタップされた座標を取得する
参考:ScreenToWorldPoint() not working


Vector3 clickPosition = Input.mousePosition;
clickPosition.z = 10f; //カメラのz位置が-10の時は、クリック座標を10にしてz平面上でのタップ位置を取得する。この行を指定しないとCamera.main.ScreenToWorldPointは単純にカメラの座標を返してしまう。
Debug.Log(Camera.main.ScreenToWorldPoint (clickPosition));

オブジェクトの重なり順をC#から指定する方法
Sprite Renderer の Order in Layer の値をスクリプトから変更する – 強火で進め

その他
HingeJointチェーンの一番下のオブジェクトのrigidbody2DにAddForceしたけど全然動かないなと思いきや、
chain.rigidbody2D.AddForce(new Vector2(300,6));
みたいに大きな数を指定してやると動いた。

親オブジェクトをRaycastでタップ判定したい際に、内包されている子オブジェクト上をタップしたことになってしまう場合
子オブジェクトのColliderのチェックをオフにすると、Raycast対象にならないようにできる。

iTween の oncomplete イベントが呼びされない場合
C#を割り当てているオブジェクト(A)とは別のオブジェクト(B)をトゥイーン対象にしている時に遭遇することがある。つまり

//A.cs上に記述
iTween.MoveTo(B,hashTable);

みたいな状況の時に、hashTable内で定義したoncompleteイベントが実行されない。これは
解決法1:oncompleteで実行するメソッドを、トゥイーン対象である別のオブジェクト(B.cs)側に記述する
解決法2:oncompletetargetで、iTweenを実行している自分自身(”oncompletetarget”,gameObject)を指定した上でA.csにoncompleteハンドラを記述する
のどちらかの対応をとれば良い。

パスに沿ってオブジェクとを移動させる
link:ハマケン100%開発: Unity: iTween Visual Editorで楽々モーションパス制作
でも紹介されている「iTween Visual Editor」を使えば、UnityのIDE上でパスの頂点を設定できて便利だが、例えば数パターンのパネル上のパスに沿って動かしたいような場合、VisualEditorで設定したパスは名前がバッティングしてエラーとなってしまう。
link:ハマケン100%開発: Unity: iTweenを使ってパス移動する方法
に書かれているような手法で、自分でパスを指定するほうが良い。

free版Unity4.2以上であれば1Directional lightでHard Shadow設定であれば影が落とせるとのことだけど、オブジェクトのテクスチャがMobile/Unlitの時はたとえCastShadowsがONになっていても、影は落ちない。
そこでテクスチャをUnlit以外にするが、影がギザギザすぎて使い物にならない。
次に、無料版でも使えるBlob Shadow Projector(参考リンク)を使ってみるが、割り当てたオブジェクトが回転すると影が変な場所に落ちて使えない。