Unity编辑器拓展【C#脚本程序基础】

Unity几个核心类

Object

它是Unity对象的基类,它有一些常用方法:

Instantiate

用来实例化Unity对象,通过Instantiate创建的物体都会被Unity管理起来。


Destroy/DestroyImmediate

销毁对象,Destroy在一般运行时候使用,对象在销毁时不是立刻就回收了,DestroyImmediate一般在写编辑器时使用,资源会立刻回收的。


FindObjectOfType/FindObjectsOfType

查找某种类型的对象。

https://docs.unity3d.com/ScriptReference/Object.html

GameObject

它是Unity场景中的实体,可以把GameObject拖到Project视图里面弄成Prefab文件。

https://docs.unity3d.com/ScriptReference/GameObject.html

MonoBehavior

它是功能的具体实现体,脚本继承于MonoBehavior后,每个GameObject可以挂脚本实现不同功能。

https://docs.unity3d.com/ScriptReference/MonoBehaviour.html

C#变量和命名空间

值类型和引用类型:http://mp.blog.csdn.net/postedit/51202926

namespace:http://mp.blog.csdn.net/postedit/77951390

C#预处理指令

C#预处理指令:http://mp.blog.csdn.net/postedit/77971711

Unity的宏

UNITY_EDITOR :判定码是在编辑器模式下执行还是在发布平台下执行

UNITY_ANDROID:判定代码运行环境是在andriod平台

UNITY_IPHONE判定代码运行环境是在ios平台

UNITY_4_6/UNITY_4_6_4:和Unity版本相关,比如这里4_6就表示Unity4.6的版本

C#委托

C#委托:http://mp.blog.csdn.net/postedit/78037951

Lambda表达式

只要有委托参数类型的地方,就可以使用Lambda表达式。

定义形参:一个参数只写参数名就足够了,多个参数放到()中,可以添加类型,例如:

//定义
public class UIEventListener : MonoBehaviour
{
	public delegate void VoidDelegate(GameObject go);
	public UIEventListener.VoidDelegate onClick;
	
	public static UIEventListener Get(GameObject go);
}
//使用例子
UIEventListener.Get(EquipBtn).onClick = go => 
{
	//点击事件处理
};

C#异常处理

异常处理:http://mp.blog.csdn.net/postedit/78002305

C#反射

反射:http://mp.blog.csdn.net/postedit/78123815

代码演示反射的部分用法:

using UnityEngine;
using System.Collections;
using System.Reflection;

public class TestReflection : MonoBehaviour {

	void OnGUI()
	{
		if(GUI.Button(new Rect(50,50,200,50), "Display Script Method info"))
		{
			Component[] components = gameObject.GetComponents<Component>();
			int len = components.Length;
			for (int i = 0; i < len; i++)
			{
				Component com = components[i];
				Debug.Log(com.ToString());   //打印出所有组件的名字

				if(com is TestReflection)
				{
					PrintMethods(com);//打印组件里面的所有方法
				}

			}
		}
	}

	/// <summary>
	/// 打印组件里面的所有方法
	/// </summary>
	/// <param name="com">COM.</param>
	void PrintMethods(Component com)
	{
		System.Type comType = com.GetType();
		MethodInfo[] methodInfos = comType.GetMethods(); 
		for (int j = 0; j < methodInfos.Length; j++) 
		{
			MethodInfo minfo = methodInfos[j];
			ParameterInfo[] parameters = minfo.GetParameters(); //参数信息
			string strParam = "";
			for (int k = 0; k < parameters.Length; k++) 
			{
				ParameterInfo param = parameters[k];
				strParam += param.ParameterType + " " + param.Name;
				if(k < parameters.Length - 1)
					strParam += ", ";
			}

			Debug.Log(string.Format("@{0} {1} ({2})", minfo.ReturnType.ToString(), minfo.Name, strParam));

		}
	}
}

C#Attribute标签

标签:http://mp.blog.csdn.net/postedit/78123322

代码演示Attribute的用法:

首先定义一个自定义标签类:

MyAttribute.cs

using UnityEngine;
using System;

[AttributeUsage(AttributeTargets.Class)]  //规定标签使用在什么地方,这里让标签只能用到类上面

//定义一个标签类
public class MyAttribute : Attribute
{
	public string DisplayName;

	public MyAttribute(string displayName)
	{
		DisplayName = displayName;
	}
}

接着在一个类中使用这个自定义标签,使用方法如下:

using UnityEngine;
using System.Collections;

[MyAttribute("反射测试类")]
//[My("反射测试类")] 这种写法也可以

public class TestAttribute : MonoBehaviour
{

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

然后我们在测试类中查找并打印出刚才定义的标签信息:

using UnityEngine;
using System.Collections;
using System.Reflection;

public class TestReflection : MonoBehaviour {

	void OnGUI()
	{
		if(GUI.Button(new Rect(50,50,200,50), "Display Script Method info"))
		{
			Component[] components = gameObject.GetComponents<Component>();
			int len = components.Length;
			for (int i = 0; i < len; i++)
			{
				Component com = components[i];
				if( com is TestAttribute)
				{
					PrintAttributes(com);
				}
			}
		}
	}


	/// <summary>
	/// 打印组件类里面所有的attributes.
	/// </summary>
	void PrintAttributes(Component com)
	{
		System.Type attType = com.GetType();
		object[] atts = attType.GetCustomAttributes(true);  //获取所有的自定义标签
		for (int m = 0; m < atts.Length; m++)
		{
			object attribute = atts[m];
			if(attribute is MyAttribute)
			{
				Debug.Log((attribute as MyAttribute).DisplayName); //显示标签展示名字
			}	
		}
	}
}

输出为:



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值