導入文(Introduction)
UnityでInstantiateを使うと、簡単にゲームオブジェクトを生成できますよね。
でも、生成したオブジェクトの大きさ(Scale)が意図せず変わってしまうことってありませんか?
親オブジェクトの影響やPrefabの設定ミスなど、原因が複数あるため、一見すると原因特定が難しいことも。この記事では、こうしたScaleの問題を解決する具体的な方法を分かりやすく解説します!
コード例も交えて解説するので、すぐに実践できますよ。ぜひ最後まで読んで、悩みをスッキリ解消しましょう!
1. Scaleが変わる原因を簡単に把握しよう
Instantiateを使ってオブジェクトを生成するとき、想定外に大きさ(Scale)が変わることがあります。特に初心者の方にとって、「なぜ?」と思うことが多い部分ですよね。でも、原因を理解すれば、解決はとても簡単です。ここでは、主な3つの原因を紹介します。
親オブジェクトの影響
生成されたオブジェクトが、どこに配置されるかが大きなポイントです。特に、親オブジェクトが設定されている場合、その親のScaleが子オブジェクトに影響します。たとえば、次のような状況を考えてみましょう。
- 親オブジェクトのScaleが
2,2,2
の場合、子オブジェクトも自動的に2倍のサイズになります。 - 親オブジェクトが
0.5,0.5,0.5
なら、子も半分のサイズに。
重要ポイント
Unityでは、親オブジェクトと子オブジェクトの関係が密接です。親のTransform設定は、そのまま子に引き継がれるため、意図しないサイズ変更が起こることがあります。
Prefabの設定ミス
Prefab自体の設定が意図と異なる場合も、問題の原因になります。Prefabとは、Unityでオブジェクトのテンプレートのようなものです。以下の点を確認してください。
- PrefabのScaleが適切か?
- 例えば、PrefabのScaleが
1,1,1
以外の場合、生成されたオブジェクトもそのScaleを引き継ぎます。
- 例えば、PrefabのScaleが
具体例
PrefabのScaleが2,2,2
に設定されていると、Instantiateで生成されたオブジェクトも自動的に2倍のサイズになります。この設定ミスに気づかないと、生成したオブジェクトが大きすぎたり、小さすぎたりします。
スクリプトでの意図しない変更
スクリプトでInstantiateした後に、意図せずScaleを変更してしまうケースもあります。特に以下のようなコードが含まれている場合、問題の原因になります。
GameObject newObject = Instantiate(prefab);
newObject.transform.localScale *= 2; // ここで意図せずサイズを変更!
注意点
- チームで開発している場合、他のスクリプトで自動的にScaleを変更する処理が組み込まれていることがあります。
- 特に再利用するPrefabでは、こうした変更が積み重なると意図しない挙動が発生しがちです。

ここまで挙げた3つの原因を知るだけでも、問題解決の糸口が見えてきます。このあと、具体的な解決方法を解説するので、ぜひ試してみてください!
2. 解決策
親オブジェクトのScaleをリセットする
生成するオブジェクトが親オブジェクトの影響を受ける場合、親のScaleをリセットするのが最も簡単な方法です。親オブジェクトのlocalScale
をVector3.one
に設定することで、子オブジェクトに不要なスケールの影響が及ばなくなります。
コード例
void Start() {
GameObject parentObject = new GameObject("Parent");
parentObject.transform.localScale = Vector3.one; // 親オブジェクトのScaleをリセット
GameObject newObject = Instantiate(prefab, parentObject.transform);
}
ポイント: 親オブジェクトを新しく作成する場合は、生成前に必ずlocalScale
をリセットしておきましょう。
Instantiate後にScaleをリセットする
親オブジェクトに依存しない場合や、生成後に強制的にオブジェクトの大きさを統一したい場合は、Instantiate直後にScaleをリセットします。
コード例
void Start() {
GameObject newObject = Instantiate(prefab);
newObject.transform.localScale = Vector3.one; // 生成後にScaleをリセット
}
ポイント: 生成直後にtransform.localScale
を明示的に設定することで、確実に大きさを統一できます。
Prefabの適切な設定を確認する
Prefabの設定そのものに問題がある場合、事前に修正しておくことが重要です。Prefabは、生成時にその設定を引き継ぐため、意図しないScaleが設定されていると問題の原因になります。
手順
- Prefabを確認
プロジェクトウィンドウでPrefabを右クリックし、「Open Prefab」を選択。 - TransformのScaleを確認
インスペクターでTransformコンポーネントを確認し、Scaleが1,1,1
になっていることを確認します。 - 設定を保存
必要な修正を行った後、Ctrl+S(MacではCmd+S)で保存します。
ポイント: Prefabを編集しておくと、後々の生成処理がスムーズになります。
どれを選ぶべき?
- 親オブジェクトの影響を避けたい場合: 「親オブジェクトのScaleをリセットする」を選択。
- 生成後に一律で大きさを統一したい場合: 「Instantiate後にScaleをリセットする」を使用。
- Prefab自体に問題がある場合: 「Prefabの適切な設定を確認する」を優先。

この手順を使えば、さまざまな状況でオブジェクトのScale問題を簡単に解決できます!
実践コードで解決
ここでは、先ほど説明した解決法を実際のコードで確認しましょう。初心者でもそのままコピー&ペーストで使えるように、コメントをつけて分かりやすく説明します。
1. 親オブジェクトのScaleをリセットしてからInstantiateする場合
このコードは、親オブジェクトの影響を避けるために、親のScaleをリセットしてからオブジェクトを生成する方法です。
using UnityEngine;
public class InstantiateExample : MonoBehaviour
{
public GameObject prefab; // 生成するPrefabをInspectorで指定
void Start()
{
// 親オブジェクトを新規作成し、Scaleをリセット
GameObject parentObject = new GameObject("Parent");
parentObject.transform.localScale = Vector3.one; // 親の大きさをリセット
// 親オブジェクトの下にPrefabを生成
GameObject newObject = Instantiate(prefab, parentObject.transform);
// デバッグログで確認
Debug.Log($"生成されたオブジェクトのScale: {newObject.transform.localScale}");
}
}
ポイント:
Vector3.one
を使って、親オブジェクトのScaleをリセットします。- 生成されたオブジェクトが親オブジェクトのScaleの影響を受けません。
2. Instantiateした後に直接Scaleをリセットする場合
このコードは、親オブジェクトを使用しない場合や、生成後にサイズをリセットしたい場合に使えます。
using UnityEngine;
public class InstantiateScaleReset : MonoBehaviour
{
public GameObject prefab; // 生成するPrefabをInspectorで指定
void Start()
{
// Prefabを生成
GameObject newObject = Instantiate(prefab);
// 生成後にScaleをリセット
newObject.transform.localScale = Vector3.one;
// デバッグログで確認
Debug.Log($"生成後にリセットされたオブジェクトのScale: {newObject.transform.localScale}");
}
}
ポイント:
- Instantiate直後に
newObject.transform.localScale = Vector3.one;
を追加するだけで簡単に解決できます。 - 他のコードとの干渉を防ぐため、明示的にScaleを指定するのが安全です。
3. 親オブジェクトと生成後リセットを組み合わせた例
親オブジェクトを使用しながら、生成後も念のためにScaleをリセットする、完全版の例です。
using UnityEngine;
public class CompleteInstantiateSolution : MonoBehaviour
{
public GameObject prefab; // 生成するPrefabをInspectorで指定
void Start()
{
// 親オブジェクトを作成してScaleをリセット
GameObject parentObject = new GameObject("Parent");
parentObject.transform.localScale = Vector3.one;
// 親オブジェクトの下にPrefabを生成
GameObject newObject = Instantiate(prefab, parentObject.transform);
// 念のため生成後にもScaleをリセット
newObject.transform.localScale = Vector3.one;
// デバッグログで確認
Debug.Log($"最終的なオブジェクトのScale: {newObject.transform.localScale}");
}
}
ポイント:
- 親オブジェクトの影響を排除しつつ、生成後のリセットも行い、万全の対策を施します。
- チーム開発や動的に親子関係を変更するシーンに特に適しています。
実行結果(Unityコンソール例)
上記のコードを使って実行すると、以下のような結果がコンソールに出力されます。
生成されたオブジェクトのScale: (1.0, 1.0, 1.0)
生成後にリセットされたオブジェクトのScale: (1.0, 1.0, 1.0)
最終的なオブジェクトのScale: (1.0, 1.0, 1.0)
これで、意図しないScale変更の問題が確実に解消できます!

このコードを実際に試してみて、自分のプロジェクトに合わせて調整してみてください!
まとめ
Instantiateでオブジェクトを生成したときに大きさが変わる問題は、親オブジェクトのScale、Prefabの設定、スクリプトの管理という3つのポイントを押さえるだけで簡単に解決できます。特に、親オブジェクトの影響を排除することや、生成後にScaleをリセットするコードは、どんなプロジェクトでも役立つ基本的なテクニックです。
問題を正しく理解し、この記事で紹介した解決策を実践することで、意図通りのオブジェクトを生成できるようになります。ぜひ自分のプロジェクトに取り入れて、スムーズなゲーム開発を楽しんでください!
よくある質問(FAQ)
- QPrefabのScale設定はどこで確認できますか?
- A
プロジェクトウィンドウでPrefabを選択し、インスペクターのTransformコンポーネントを確認してください。
- Q親オブジェクトが動的に変更される場合、どう対応すればいいですか?
- A
親オブジェクトを動的に生成する際は、生成時に
localScale = Vector3.one
でリセットするコードを加えてください。
- QなぜScaleの問題が起きるのですか?
- A
Unityでは、子オブジェクトが親オブジェクトのTransform設定を引き継ぐためです。これを防ぐには、親子関係やPrefabの設定を適切に管理する必要があります。