老规矩,不想看博客的直接下载,传送门
MVC简介:MVC
小项目就不建议,避免过度设计。
上代码:
Model块:(数据、逻辑层)
using UnityEngine;
public class Model : MonoBehaviour
{
}
View块:(视图层)
using UnityEngine;
public class View : MonoBehaviour
{
void Awake()
{
}
void Start()
{
}
}
Control块:(控制中转层)
using UnityEngine;
public class Control : MonoBehaviour
{
private Model _model;
internal Model Model
{
get
{
if (_model != null)
{
return _model;
}
else
{
_model = GameObject.FindWithTag("Model").GetComponent<Model>();
return _model;
}
}
set
{
if (_model != null)
{
_model = value;
}
else
{
_model = GameObject.FindWithTag("Model").GetComponent<Model>();
_model = value;
}
}
}
private View _view;
internal View View
{
get
{
if (_view != null)
{
return _view;
}
else
{
_view = GameObject.FindWithTag("View").GetComponent<View>();
return _view;
}
}
set
{
if (_view != null)
{
_view = value;
}
else
{
_view = GameObject.FindWithTag("View").GetComponent<View>();
_view = value;
}
}
}
}
BaseControl:(父类,省去控制器每次都要获取中转控制层Control的麻烦,相关控制器只需继承即可)
using UnityEngine;
public class BaseControl : MonoBehaviour
{
private Control _ctrl;
internal Control Ctrl
{
get
{
if (_ctrl != null)
{
return _ctrl;
}
else
{
_ctrl = GameObject.FindWithTag("Control").GetComponent<Control>();
return _ctrl;
}
}
set
{
if (_ctrl != null)
{
_ctrl = value;
}
else
{
_ctrl = GameObject.FindWithTag("Control").GetComponent<Control>();
_ctrl = value;
}
}
}
}
GameManager层:(游戏控制层)
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
public class GameManager : BaseControl
{
void Awake()
{
}
void Update()
{
}
#region 动态创建tag、物体、挂载脚本
[ContextMenu("添加设置标签")]
void Add()
{
#if UNITY_EDITOR
AddTag<Model>("Model");
AddTag<View>("View");
AddTag<Control>("Control");
#endif
}
void AddTag<T>(string tag) where T : Component
{
if (!isHasTag(tag))
{
GameObject obj = new GameObject(tag);
obj.AddComponent<T>();
SerializedObject tagManager = new SerializedObject(obj);//序列化物体
SerializedProperty it = tagManager.GetIterator();//序列化属性
while (it.NextVisible(true))//下一属性的可见性
{
if (it.name == "m_TagString")
{
//Debug.Log(it.stringValue);
it.stringValue = tag;
tagManager.ApplyModifiedProperties();
}
}
}
}
bool isHasTag(string tag)
{
foreach (var t in UnityEditorInternal.InternalEditorUtility.tags)
{
if (t.Equals(tag))
return true;
}
return false;
}
#endregion
}
主要做了什么:
导入GameManager预制体,点击一下即可一键生成、挂载、设置物体。
看图
懒癌患者请收下
创建的时候只做了 没有tag的判断再创建。已有tag没做判断。想完善你们自己搞吧,搞完发我一份,谢谢