「Unity/Prefab」の版間の差分
(→GameObjectのボタンなどを別のPrefabに値を差し替える) |
|||
(同じ利用者による、間の7版が非表示) | |||
行1: | 行1: | ||
+ | ==3dのPrefabはこちら== | ||
+ | [[Unity/3d/Prefab]] [ショートカット] | ||
+ | |||
+ | ==SerializeFieldを使ってPrefabからインスタンスを設置する== | ||
+ | 例としてButtonを設置 | ||
+ | # HieraruchyにUI/Buttonを選択し追加 | ||
+ | # Project(Assetsの下に)にPrefabsディレクトリを作成する。(Prefabs名はわかりやすい名前で何でも良い) | ||
+ | # 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を複製 | ||
+ | # HieraruchyにUI/Buttonを選択し追加 | ||
+ | # Project(Assetsの下に)にResourcesディレクトリを作成する(名前は、Resources名でないとならない) | ||
+ | # ButtonをResourcesディレクトリへドラッグする | ||
+ | 以下コードで複製できる | ||
+ | <pre> | ||
+ | GameObject buttonPrefab = (GameObject)Resources.Load("Button"); | ||
+ | GameObject obj = Instantiate(buttonPrefab, Vector3.zero, Quaternion.identity); | ||
+ | obj.name = "button" + i; | ||
+ | </pre> | ||
+ | |||
+ | Resourcesディレクトリはオブジェクトを読込時に使われるディレクトリ名でunityのルールらしい。 | ||
+ | |||
+ | ==PrefabをInstantiateで複製したものを削除== | ||
+ | <pre> | ||
+ | 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); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ==parentの引数名をかけば、第4引数までを省略できる== | ||
+ | Instantiate(textPrefab, parent: scrollContent.transform); | ||
+ | |||
+ | ==アタッチオブジェクトのcanvasの位置== | ||
+ | SetParentを使う | ||
+ | <pre> | ||
+ | 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); | ||
+ | </pre> | ||
+ | SetParentとlocalScaleなどの順番によって表示が異なるので気をつける。基本的にはSetParentを先に追加がわかりやすいと思う。 | ||
+ | |||
+ | もしくはInstantiateの第4パラメータを使う。 | ||
+ | GameObject obj = Instantiate(prefab, position, Quaternion.identity, rouletteBackImage.transform); | ||
==Prefabを編集== | ==Prefabを編集== | ||
行19: | 行91: | ||
参考:https://docs.unity3d.com/ja/2022.3/Manual/EditingPrefabViaInstance.html | 参考: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に値を差し替える== | ||
+ | #親にしたいボタンをPrefab化しておく。 | ||
+ | #GameObjectのボタンを右クリックし、Prefab/Replace... を選択する。 | ||
+ | #親にしたいPrefabのボタンを選択する 。 | ||
+ | |||
+ | 変更後のデータを見ると、PrefabのButtonとGameObjectのButtonの差分が、Buttonコンポーネントに残っていた。 | ||
+ | (具体的にはOnClickなどの情報) | ||
+ | ただ、Buttonの下のTextなどは、完全に、差し替えられるようだった。 | ||
+ | |||
+ | 参考:https://kan-kikuchi.hatenablog.com/entry/Replace_Prefab | ||
==UIPrefab== | ==UIPrefab== | ||
行24: | 行116: | ||
CanvasRendererとか、RectTransformを追加すれば良い。 | CanvasRendererとか、RectTransformを追加すれば良い。 | ||
簡単に追加する方法は、Imageとかを作り、そちらにComponentを移し替えれば、良い。 | 簡単に追加する方法は、Imageとかを作り、そちらにComponentを移し替えれば、良い。 | ||
+ | |||
+ | ==Prefabの分析== | ||
+ | Aaaa.Prefabを、テキストエディタで開くと以下のようになる。 | ||
+ | Aaaa.Prefabには、Buttonコンポーネントだけが追加されてある。 | ||
+ | <pre> | ||
+ | %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: [] | ||
+ | </pre> | ||
+ | 一番上にGameObjectがありm_NameにAaaaがある。一番下にMonoBehaviourがあり、これがButtonコンポーネント。 |
2025年4月24日 (木) 10:20時点における最新版
目次
3dのPrefabはこちら
Unity/3d/Prefab [ショートカット]
SerializeFieldを使ってPrefabからインスタンスを設置する
例としてButtonを設置
- HieraruchyにUI/Buttonを選択し追加
- Project(Assetsの下に)にPrefabsディレクトリを作成する。(Prefabs名はわかりやすい名前で何でも良い)
- 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を複製
- HieraruchyにUI/Buttonを選択し追加
- Project(Assetsの下に)にResourcesディレクトリを作成する(名前は、Resources名でないとならない)
- 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側に反映
- Sceneに配置されてるPrefabのオブジェクトを修正
- Sceneに配置されてるPrefabのオブジェクトのInspectorのOverridesを開き、差分が出てることを確認。
- Sceneに配置されてるPrefabのオブジェクトのInspectorのOverridesの部分で、ApplyAllを選択すると、変更がPrefab側へ反映される。
- 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に値を差し替える
- 親にしたいボタンをPrefab化しておく。
- GameObjectのボタンを右クリックし、Prefab/Replace... を選択する。
- 親にしたい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コンポーネント。