unity」カテゴリーアーカイブ

アニメーションが再生されない問題

オブジェクトにアタッチしたアニメーションコンポーネントが再生されずに、ログに「… used by the Animation component ‘…’ must be marked as Legacy.」と表示されていた。解決策はアニメーションクリップをクリックして画面右上のものすごく小さいアイコンをクリックして、NormalからDebugに変更する。表示されたその中にAnimation Type項目があるので 2 から 1に変更する。2はたぶんMecanimの事で、1は前のLegacyのバージョンの事だと思う。

Unity、Tagのついたオブジェクトをスクリプトから取得する際、Cloneオブジェクトを取得してしまう問題

GameObject.FindGameObjectWithTag関数の戻り値にインスタンス化されておらず、HierarchyにもないPrefabを取得してしまう問題。

解決策はそのTagの付加されたすべてを取得して、その中のものがHierarchyに存在するかどうかを調べ、存在していればそれを選択する。

		GameObject gameObject;
		GameObject[] gameObjects = GameObject.FindGameObjectsWithTag("HogeHoge");
		foreach(GameObject temp in gameObjects){
			if(temp.activeInHierarchy){
				gameObject = temp;
				break;
			}
		}

上記のスクリプトのactiveInHierarchyがtrueでもCloneオブジェクトを何故か拾うので、上記のは使えない。かわりにオブジェクトの名前にCloneという文字列を含んでいるか含んでいないかで判断する。すると以下のようになる。

		GameObject gameObject;
		GameObject[] gameObjects = GameObject.FindGameObjectsWithTag("HogeHoge");
		foreach(GameObject temp in gameObjects){
			if(temp.name.IndexOf("Clone") == -1){
				gameObject = temp;
				break;
			}
		}

transform.forwardとtransform.rotation * Vector3.forwardについて

transform.forwardの値はtransform.rotation * Vector3.forwardと等しい。

それならtransform.rotation * Vector3.forwardの使い道は文が長くなるので使わないが、ちょっと式を変更すると使う場面がある。例えばQuaternionの値だけ分かっている時、このローカル座標のz軸をワールド座標に変換したいのなら

Quaternion rotation = Quaternion.Euler(0, 45, 0);
Vector3 position = rotation * Vector3.forward;

と出来る。

Unity、自キャラを傾かせずに敵キャラへ向かせるには

transform.LookAt関数を使えば自キャラを敵キャラへ簡単に向かせられるが、敵キャラが自キャラより高い場所にいる時は、自キャラが傾いてしまう。傾かないようにするには以下のようにする


using UnityEngine;
using System.Collections;

public class MyTestLookRotation : MonoBehaviour {

	public Transform target;
	void Update() {

		Vector3 relativePos = target.position - transform.position;

		relativePos.y = 0;

		Quaternion rotation = Quaternion.LookRotation(relativePos);

		transform.rotation = rotation;
	}
}

参考になったUnity公式ページ