using UnityEngine; using FSA = UnityEngine.Serialization.FormerlySerializedAsAttribute; namespace Lean.Common { /// This component allows you to spawn a prefab at the specified world point. /// NOTE: For this component to work you must manually call the Spawn method from somewhere. [HelpURL(LeanHelper.HelpUrlPrefix + "LeanSpawn")] [AddComponentMenu(LeanHelper.ComponentPathPrefix + "Spawn")] public class LeanSpawn : MonoBehaviour { public enum SourceType { ThisTransform, Prefab } /// The prefab that this component can spawn. public Transform Prefab { set { prefab = value; } get { return prefab; } } [FSA("Prefab")] [SerializeField] private Transform prefab; /// If you call Spawn(), where should the position come from? public SourceType DefaultPosition { set { defaultPosition = value; } get { return defaultPosition; } } [FSA("DefaultPosition")] [SerializeField] private SourceType defaultPosition; /// If you call Spawn(), where should the rotation come from? public SourceType DefaultRotation { set { defaultRotation = value; } get { return defaultRotation; } } [FSA("DefaultRotation")] [SerializeField] private SourceType defaultRotation; /// This will spawn Prefab at the current Transform.position. public void Spawn() { if (prefab != null) { var position = defaultPosition == SourceType.Prefab ? prefab.position : transform.position; var rotation = defaultRotation == SourceType.Prefab ? prefab.rotation : transform.rotation; var clone = Instantiate(prefab, position, rotation); clone.gameObject.SetActive(true); } } /// This will spawn Prefab at the specified position in world space. public void Spawn(Vector3 position) { if (prefab != null) { var rotation = defaultRotation == SourceType.Prefab ? prefab.rotation : transform.rotation; var clone = Instantiate(prefab, position, rotation); clone.gameObject.SetActive(true); } } } } #if UNITY_EDITOR namespace Lean.Common.Editor { using TARGET = LeanSpawn; [UnityEditor.CanEditMultipleObjects] [UnityEditor.CustomEditor(typeof(TARGET))] public class LeanSpawn_Editor : LeanEditor { protected override void OnInspector() { TARGET tgt; TARGET[] tgts; GetTargets(out tgt, out tgts); BeginError(Any(tgts, t => t.Prefab == null)); Draw("prefab", "The prefab that this component can spawn."); EndError(); Draw("defaultPosition", "If you call Spawn(), where should the position come from?"); Draw("defaultRotation", "If you call Spawn(), where should the rotation come from?"); } } } #endif