查找场景物体脚本
using UnityEngine;
using System.Collections.Generic;
using System.Collections;
using System;
using System.Text;
using UnityEngine.SceneManagement;
public class Misc
{
static public GameObject findSceneRootObject(string _name)
{
Scene sc = SceneManager.GetActiveScene();
GameObject[] root_obj = sc.GetRootGameObjects();
for (int i = 0; i < root_obj.Length; ++i)
{
if (root_obj[i].name == _name)
{
return root_obj[i];
}
}
return null;
}
// 大多能用到这个脚本 参数:父物体, 要查找物体的名字
static public GameObject findChild(Transform _trans, string _child_name)
{
Transform child = _trans.Find(_child_name);
if (child != null)
{
return child.gameObject;
}
GameObject go = null;
int count = _trans.childCount;
for (int i = 0; i < count; ++i)
{
child = _trans.GetChild(i);
go = findChild(child, _child_name);
if (go != null)
{
return go;
}
}
return null;
}
static public List findChildAlls(Transform _trans, ref List _list)
{
for (int i = 0; i < _trans.childCount; ++i)
{
_list.Add(_trans.GetChild(i).gameObject);
}
return _list;
}
//
static public List findChildAlls(Transform _trans, string _child_name, ref List _list)
{
if (_list != null)
{
GameObject child = findChild(_trans, _child_name);
if (child != null)
{
for (int i = 0; i < child.transform.childCount; ++i)
{
_list.Add(child.transform.GetChild(i).gameObject);
}
}
}
return _list;
}
static public T findParentComponent(Transform _tran, string _parent_name) where T : Component
{
Transform parent = _tran.parent;
while (parent != null)
{
T component = parent.GetComponent();
if (component != null)
{
return component;
}
else
{
parent = parent.parent;
}
}
return null;
}
static public List findChildComponent(Transform _trans, ref List _list)
{
if (_list != null)
{
Transform child = null;
int count = _trans.childCount;
for (int i = 0; i < count; ++i)
{
child = _trans.GetChild(i);
if (child.GetComponent() != null)
{
_list.Add(child.GetComponent());
}
}
}
return _list;
}
static public List findChildAllsComponent(Transform _trans, ref List _list) where T : Component
{
if (_list != null)
{
Transform child = null;
int count = _trans.childCount;
for (int i = 0; i < count; ++i)
{
child = _trans.GetChild(i);
if (child.GetComponent() != null)
{
_list.Add(child.GetComponent());
}
findChildAllsComponent(child, ref _list);
}
}
return _list;
}
static public List findChildAllsComponent(Transform _trans, string _child_name, ref List _list) where T : Component
{
if (_list != null)
{
GameObject child = findChild(_trans, _child_name);
if (child != null)
{
findChildAllsComponent(child.transform, ref _list);
}
}
return _list;
}
//
static public T findChildComponent(Transform _trans, string _child_name) where T : Component
{
GameObject go = findChild(_trans, _child_name);
if (go != null)
{
return go.GetComponent();
}
return null;
}
}
继承MonoBehaviour的单例
继承该脚本,其脚本就附有单例效果
using UnityEngine;
using System.Collections;
public class MonoSingleton : MonoBehaviour where T : MonoSingleton
{
static private T s_instance = null;
protected bool m_initial_flg = false;
public bool isInitial()
{
return m_initial_flg;
}
//
public void Awake()
{
if (s_instance == null)
{
s_instance = this as T;
}
initial();
}
protected virtual void initial()
{
}
//
//
static public T getSingleton()
{
return s_instance;
}
}
BasePanel.cs
using UnityEngine;
using System.Collections;
public class BasePanel : MonoBehaviour {
//皮肤路径
public string skinPath;
//皮肤
public GameObject skin;
//层级
public PanelManager.Layer layer = PanelManager.Layer.Panel;
//初始化
public void Init(){
//皮肤
GameObject skinPrefab = ResManager.LoadPrefab(skinPath);
skin = (GameObject)Instantiate(skinPrefab);
}
//关闭
public void Close(){
string name = this.GetType().ToString();
PanelManager.Close(name);
DebugLog(name);
}
//初始化时
public virtual void OnInit(){
}
//显示时
public virtual void OnShow(params object[] para){
}
//关闭时
public virtual void OnClose(){
}
public static void DebugLog(string name)
{
Debug.Log(name);
}
}
PanelManager.cs;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public static class PanelManager{
//Layer
public enum Layer{
Panel,
Tip,
}
//层级列表
private static Dictionary layers = new Dictionary();
//面板列表
public static Dictionary panels = new Dictionary();
//激活面板列表
public static List NowPanels = new List();
//结构
public static Transform root;
public static Transform canvas;
//当前激活面板参数
public static string PanelName;
//初始化
public static void Init(){
root = GameObject.Find("Root").transform;
canvas = root.Find("Canvas");
Transform panel = canvas.Find("Panel");
Transform tip = canvas.Find("Tip");
layers.Add(Layer.Panel, panel);
layers.Add(Layer.Tip, tip);
}
//打开面板
public static void Open(params object[] para) where T:BasePanel{
//已经打开
string name = typeof(T).ToString();
if (panels.ContainsKey(name)){
return;
}
//组件
BasePanel panel = root.gameObject.AddComponent();
panel.OnInit();
panel.Init();
//父容器
Transform layer = layers[panel.layer];
panel.skin.transform.SetParent(layer, false);
//列表
panels.Add(name, panel);
//OnShow
panel.OnShow(para);
PanelName = name;
}
public static void CloseAll()
{
foreach (string key in panels.Keys)
{
NowPanels.Add(key);
}
foreach (var item in NowPanels)
{
Close(item);
}
}
public static void Resert()
{
layers.Clear();
panels.Clear();
}
//关闭面板
public static void Close(string name){
//没有打开
if(!panels.ContainsKey(name)){
return;
}
BasePanel panel = panels[name];
//OnClose
panel.OnClose();
//列表
panels.Remove(name);
//销毁
GameObject.Destroy(panel.skin);
Component.Destroy(panel);
}
}
ResManager
using UnityEngine;
public class ResManager : MonoBehaviour {
//加载预设
public static GameObject LoadPrefab(string path){
return Resources.Load("MoKuai/"+path);
}
}
UI工具使用前,需要先调用PanelManager.Init()方法进行初始化,其场景中需要有命名Root,Canvas,Panel,Tip的物体如图:
注意 把UI做成Prefab,放入文件夹后,加载时需要 预制体的名字与脚本名字一致,一个预制体一个脚本,其脚本须继承BasePanel
这只是项目里用的其中几个,如有需要我会继续更新