Unityでコミットするときに手を付けてないファイルが変更されていたのでメモ。
Assetsのprefabやマテリアルをスクリプトで直接変更すると、実行するたびにそのファイルが変更されてしまいます。
以下のスクリプトだと実行するたびにAssets/Resouces/Cube.prefabがX方向に移動してしまいます。
ObjectMove.cs
// ※ダメな例
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
// 初回更新
void Start()
{
// Assetsのprefabを読み込み
GameObject prefab = Resources.Load( "Cube" ) as GameObject;
// 読み込んだprefabをX方向に移動
prefab.transform.position += new Vector3( 1.0f, 0.0f, 0.0f );
}
}
Assetsのファイルは直接変更せず、Instantiateで生成したオブジェクトを変更すれば大丈夫。
ObjectMove.cs
// ※こっちだと大丈夫
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
// 初回更新
void Start()
{
// Assetsのprefabを読み込み
GameObject prefab = Resources.Load( "Cube" ) as GameObject;
// インスタンス
GameObject cube = Instantiate( prefab );
// X方向に移動
cube.transform.position += new Vector3( 1.0f, 0.0f, 0.0f );
}
}
InspectorでAssetsのファイルをアタッチするときも注意
Resources.Loadだと気が付きやすいのですが、InspectorでAssetsのファイルを直接アタッチ場合でも同様のことが起こるので注意
こっちも以下のようなスクリプトだと実行するたびにどんどんX方向に移動してしまいます...
ObjectMove.cs
// ※ダメな例
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
// Inspectorでアタッチしたオブジェクト
public GameObject prefab;
// 初回更新
void Start()
{
// X方向に移動
prefab.transform.position += new Vector3( 1.0f, 0.0f, 0.0f );
}
}
Instantiateで生成したものを変更すれば大丈夫
ObjectMove.cs
// ※こっちだと大丈夫
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
// Inspectorでアタッチしたオブジェクト
public GameObject prefab;
// 初回更新
void Start()
{
// インスタンス
GameObject cube = Instantiate( prefab );
// X方向に移動
cube.transform.position += new Vector3( 1.0f, 0.0f, 0.0f );
}
}