はきだめ

プログラミングのこととか色々

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

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

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

window→Lighting→Settings f:id:kurome-stdio:20170504230449p:plain Auto Generateのチェックを外して
f:id:kurome-stdio:20170504230630p:plain Generate Lightingをクリック
※いじるのは遷移先のシーンのLightingの設定です。
何がムカつくって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