はきだめ

主にプログラミングに関することをかきます

個人的なUnityはまりポイント

Unityをやってて自分がよくハマるところをまとめました。

シーンを遷移すると画面が暗くなる ver5.6

window→Lighting→Settings

f:id:kurome-stdio:20170504230449p:plain

Auto Generateのチェックを外して

f:id:kurome-stdio:20170504230630p:plain

Generate Lightingをクリック
※いじるのは遷移先のシーンのLightingの設定です。
何がムカつくってunityのversionが変わるたびにこのここらへんの名称とLightingの設定の場所が変わることなんですよね…。原因としてはautoだとシーンを遷移したときにライトが間に合わないから予め焚いておく必要があるみたいです(?)

オブジェクトが壁をすり抜ける

transform.Translateとかtransform.positionとかで座標を指定して動かすとすり抜けます。解決策としてはRigitbodyとColliderを付けてRigitbody.AddForceとかで動かす。

※Rigitbodyでもすり抜ける場合

移動してくる物体が速すぎると衝突判定をする関数に引っかからずにすり抜けてしまうらしい。
解決策

  • RigidbodyにあるCollision Detectionを"Continuous"にする。

  • Edit > Project Settings > Time から、Fixed Timestepの値を小さくする(全体的に重くなるので注意)

  • Mathf.Clampとかでオブジェクトが動く幅を制限する。

transform.positionに直接値を代入できない

Cannot modify a value type return value of ‘UnityEngine.Transform.position’.
Consider storing the value in a temporary variable. 直接transform.positionに値を代入できません。一時的な変数に代入してからtransform.positionに入れてくださいみたいなことをいってるんだと思います。自分の場合はさっきの例でスクリプトでオブジェクトを動く幅を制限したときにtransform.positionに直接Mathf.Clampで制限した値をぶち込んだらエラーになったので

z = Input.GetAxis("Horizontal");
y = Input.GetAxis("Vertical");
Vector3 v = new Vector3(0, y * speed, z * speed);
transform.Translate (v);
transform.position.y = Mathf.Clamp (transform.position.y, 2.0f, 18.2f);
transform.position.z = Mathf.Clamp (transform.position.z, -13.0f, 13.4f);


から

z = Input.GetAxis("Horizontal");
y = Input.GetAxis("Vertical");
Vector3 v = new Vector3(0, y * speed, z * speed);
Vector3 Position = transform.position;
transform.Translate (v);
Position.y = Mathf.Clamp (transform.position.y, 2.0f, 18.2f);
Position.z = Mathf.Clamp (transform.position.z, -13.0f, 13.4f);
transform.position = Position;

という風に一時的にVector3に入れてからtransform.positionに入れたらエラーが無くなりました。

参考文献

Unityまとめ

Unity C# エラーはまりポイント - Qiita