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