facebook twitter hatena line email

Unity/Prefab

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

3dのPrefabはこちら

Unity/3d/Prefab [ショートカット]

SerializeFieldを使ってPrefabからインスタンスを設置する

例としてButtonを設置

  1. HieraruchyにUI/Buttonを選択し追加
  2. Project(Assetsの下に)にPrefabsディレクトリを作成する。(Prefabs名はわかりやすい名前で何でも良い)
  3. ButtonをPrefabsディレクトリへドラッグする

以下コードで設置できる

[SerializeField] GameObject buttonPrefab;
GameObject obj = Instantiate(buttonPrefab, Vector3.zero, Quaternion.identity);
obj.name = "button" + i;

上記csを貼り付けた、オブジェクトのinspectorを開いて、buttonPrefabに、Prefabsに入れたButtonを設置する。

PrefabをInstantiateで複製する

例としてButtonを複製

  1. HieraruchyにUI/Buttonを選択し追加
  2. Project(Assetsの下に)にResourcesディレクトリを作成する(名前は、Resources名でないとならない)
  3. ButtonをResourcesディレクトリへドラッグする

以下コードで複製できる

GameObject buttonPrefab = (GameObject)Resources.Load("Button");
GameObject obj = Instantiate(buttonPrefab, Vector3.zero, Quaternion.identity);
obj.name = "button" + i;

Resourcesディレクトリはオブジェクトを読込時に使われるディレクトリ名でunityのルールらしい。

PrefabをInstantiateで複製したものを削除

List<GameObject> list_obj = new List<GameObject>();
GameObject buttonPrefab = (GameObject)Resources.Load("Button");
GameObject obj = Instantiate(buttonPrefab, Vector3.zero, Quaternion.identity);
list_obj.Add(obj);

// 削除チェック
for (int i = 0; i < list_obj.Count; i++)
{
           GameObject obj = list_obj[i];
           if (obj == null) {
               continue;
           }
           if (obj.transform.position.y < -10) {
               Destroy(list_obj[i]);
               Debug.Log("削除 i=" + i);
           }
}

parentの引数名をかけば、第4引数までを省略できる

Instantiate(textPrefab, parent: scrollContent.transform);

アタッチオブジェクトのcanvasの位置

SetParentを使う

GameObject rObject;
GameObject prefab = (GameObject)Resources.Load("RObject");
Vector3 position = new Vector3(
            rouletteBackImage.transform.localPosition.x,
            rouletteBackImage.transform.localPosition.y,
            rouletteBackImage.transform.localPosition.z - 0.2f);
GameObject rObject = Instantiate(prefab, position, Quaternion.identity);
rObject.name = "RObject" + angle;
rObject.transform.SetParent(GameObject.Find("/Canvas").transform);
// rObject.transform.localScale = new Vector3(152.68f, 152.68f, 152.68f); // 場合によっては追加
rObject.transform.localPosition = new Vector3(0f, 0f, - 30f);

SetParentとlocalScaleなどの順番によって表示が異なるので気をつける。基本的にはSetParentを先に追加がわかりやすいと思う。

もしくはInstantiateの第4パラメータを使う。

 GameObject obj = Instantiate(prefab, position, Quaternion.identity, rouletteBackImage.transform);

Prefabを編集

  • プレハブ側ファイルを編集すると、設置しているScene内のプレハブが自動更新される。
  • Scene内のプレハブを編集すると、Scene内のObjectが編集されるが、プレハブ側ファイルは変更されない。
  • Scene内に同じオブジェクトがある場合は、プレハブ化して、おくと良い。gitで管理してる場合も楽かも。

Prefabの内、一部オブジェクトだけ変更したい場合

  • Scene内のプレハブは編集すると、オブジェクトのアイコンに+マークが付き文字が白くなる。これは他のPrefabには影響しないので、そのオブジェクトにだけ変更を加えたい場合はそのようにする。

修正ファイル

  • Prefabだけを、更新した場合は、Prefabファイルが更新される。
  • Prefabの一部オブジェクトを、変更した場合は、~Scene.unityが更新される。

Sceneに配置されてるPrefabの修正を、Prefab側に反映

  1. Sceneに配置されてるPrefabのオブジェクトを修正
  2. Sceneに配置されてるPrefabのオブジェクトのInspectorのOverridesを開き、差分が出てることを確認。
  3. Sceneに配置されてるPrefabのオブジェクトのInspectorのOverridesの部分で、ApplyAllを選択すると、変更がPrefab側へ反映される。
  4. Sceneに配置されてるPrefabのオブジェクト側の変更は、残ったままだが、破棄しても問題ない。

参考:https://docs.unity3d.com/ja/2022.3/Manual/EditingPrefabViaInstance.html

Prefabに追加されてるボタンなどのPrefabを差し替えたいとき

OldButton.prefab が入ってるHogeDialog.prefabがあったときで、 HogeDialog.prefab内の、OldButton.prefabを、NewButton.prefabに差し替える場合。 HogeDialog.prefab内のOldButton.prefabを選択し、Inspectorを開いて、PrefabにNewButton.prefabをドラッグする。 "Replace"と、"Replace and Keep Overrides"の選択が出てくるが、 PrefabとGameObjectに差分があり、その設定を維持したい場合は、"Replace and Keep Overrides"を選択するとよい。

参考:https://kan-kikuchi.hatenablog.com/entry/Replace_Prefab

GameObjectのボタンなどを別のPrefabに値を差し替える

  1. 親にしたいボタンをPrefab化しておく。
  2. GameObjectのボタンを右クリックし、Prefab/Replace... を選択する。
  3. 親にしたいPrefabのボタンを選択する 。

変更後のデータを見ると、PrefabのButtonとGameObjectのButtonの差分が、Buttonコンポーネントに残っていた。 (具体的にはOnClickなどの情報) ただ、Buttonの下のTextなどは、完全に、差し替えられるようだった。

参考:https://kan-kikuchi.hatenablog.com/entry/Replace_Prefab

UIPrefab

Prefabを選択した際に、Sceneに画面が出ない(Canvas(Environment)がでないときは、 CanvasRendererとか、RectTransformを追加すれば良い。 簡単に追加する方法は、Imageとかを作り、そちらにComponentを移し替えれば、良い。

Prefabの分析

Aaaa.Prefabを、テキストエディタで開くと以下のようになる。 Aaaa.Prefabには、Buttonコンポーネントだけが追加されてある。

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &4036905543814177402
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 2795986973129483262}
  - component: {fileID: 6540708359075980082}
  m_Layer: 0
  m_Name: Aaaa
  m_TagString: Untagged
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!4 &2795986973129483262
Transform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 4036905543814177402}
  serializedVersion: 2
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 960.60004, y: 137.25, z: 0}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_ConstrainProportionsScale: 0
  m_Children: []
  m_Father: {fileID: 0}
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &6540708359075980082
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 4036905543814177402}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
  m_Name:-
  m_EditorClassIdentifier:-
  m_Navigation:
    m_Mode: 3
    m_WrapAround: 0
    m_SelectOnUp: {fileID: 0}
    m_SelectOnDown: {fileID: 0}
    m_SelectOnLeft: {fileID: 0}
    m_SelectOnRight: {fileID: 0}
  m_Transition: 1
  m_Colors:
    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
    m_ColorMultiplier: 1
    m_FadeDuration: 0.1
  m_SpriteState:
    m_HighlightedSprite: {fileID: 0}
    m_PressedSprite: {fileID: 0}
    m_SelectedSprite: {fileID: 0}
    m_DisabledSprite: {fileID: 0}
  m_AnimationTriggers:
    m_NormalTrigger: Normal
    m_HighlightedTrigger: Highlighted
    m_PressedTrigger: Pressed
    m_SelectedTrigger: Selected
    m_DisabledTrigger: Disabled
  m_Interactable: 1
  m_TargetGraphic: {fileID: 0}
  m_OnClick:
    m_PersistentCalls:
      m_Calls: []

一番上にGameObjectがありm_NameにAaaaがある。一番下にMonoBehaviourがあり、これがButtonコンポーネント。