还需进一步整理!html
ing...linux
Unity 相关博客:Unity游戏开发爱好者正则表达式
按钮:sql
Unity 5 UI Tutorial - Button and event handlers数据库
输入框:缓存
Unity 5 UI Tutorial - Input field and event handlers安全
using UnityEngine; using UnityEngine.UI; public class Button_event_test : MonoBehaviour { public void Button_Click() { string str_inputField1 = "Hello world - test123"; Debug.Log(str_inputField1); // 获取这个对象 GameObject inputObj = GameObject.Find("Canvas/Panel/InputField1");
// 拨开这个对象的真正面目 InputField input = (InputField)inputObj.GetComponent<InputField>(); // 获得这个对象的属性 str_inputField1 = input.text.ToString(); Debug.Log(str_inputField1); } }
Ref:Unity-3D 简单登录界面,在此基础上作修改。框架
using UnityEngine; using System.Collections; public class Label : MonoBehaviour { private string userName; private string passWord; private string username; private string password; private string message; private string info; public Texture img;
void OnGUI() { GUIStyle sty = new GUIStyle(); GUIStyle sty1 = new GUIStyle(); sty.fontSize = 20; sty1.fontSize = 40; GUI.Label(new Rect(120, 10, 100, 30), "登陆界面", sty1); GUI.Label(new Rect(30, 70, 100, 30), "用户名:", sty); userName = GUI.TextField(new Rect(120, 70, 200, 30),userName,20); GUI.Label(new Rect(30, 110, 100, 30), "密码:",sty); passWord = GUI.PasswordField(new Rect(120, 110, 200, 30), passWord, '*', 15); message = GUI.TextArea(new Rect(400, 30, 200, 200), message, sty);
if (GUI.Button(new Rect(220, 150, 110, 30), "login")) { if (username == userName && password == passWord) { info = "success!"; message = "床前明月光,\n疑是地上霜。\n举头望明月,\n低头思故乡。\n"; } else info = "failed!"; } sty.fontSize = 40; GUI.Label(new Rect(150, 210, 512, 225), info,sty); }
// Use this for initialization void Start () { userName = ""; passWord = ""; message = ""; info = ""; username = "wonameshuai"; # default password = "nishuodedui"; # default } // Update is called once per frame void Update () { } }
加图片:编辑器
//用户名 private var editUsername : String; //密码 private var editPassword : String; //提示信息 private var editShow : String; function Start() { editShow = "请您输入正确的用户名与密码"; editUsername = "请输入用户名"; editPassword = "请输入密码"; } function OnGUI () { //显示提示信息内容 GUI.Label(Rect(10, 10, Screen.width, 30), editShow); if (GUI.Button(Rect(10,120,100,50),"登陆")) { //点击按钮修改提示信息 editShow = "您输入的用户名为 :" + editUsername + " 您输入的密码为:"+ editPassword; }
//编辑框提示信息 GUI.Label(Rect(10, 40, 50, 30), "用户名"); GUI.Label(Rect(10, 80, 50, 30), "密码:"); //获取输入框输入的内容 editUsername = GUI.TextField (Rect (60, 40, 200, 30), editUsername, 15); editPassword = GUI.PasswordField (Rect (60, 80, 200, 30), editPassword, "*"[0],15); }
代码研究ide
Panel加载图片:
那是由于你没把图片设置为Sprite (小精灵),图片只是Texture而已,只能做为贴图使用。
Goto: Unity3D在UI中加入Image图片
点击事件配置:
Goto: Unity 4.6 uGUI的点击事件
发送消息,发送给谁? 如何控制?
using UnityEngine; using System.Collections; using UnityEngine.UI; public class testclick : MonoBehaviour { // Use this for initialization void Start () { Button btn = gameObject.GetComponent<Button>(); btn.onClick.AddListener(click); } void click() { Debug.Log ("Mouse Click"); } }
Unity 3种message消息管理使用
Ref: http://blog.csdn.net/u011484013/article/details/51487936
MonoBehaviour 是 Unity 中全部脚本的基类,
using UnityEngine; using System.Collections; public class xx1 : MonoBehaviour { void OnGUI() { if (GUI.Button(new Rect(10, 10, 100, 50), "发送1")) {//this gameobjec SendMessage("myTest"); # <-- button 1 向当前对象挂载的全部脚本上面发送消息
}
if (GUI.Button(new Rect(10, 150, 100, 50), "发送2")) {//this gameobjec and it's childs BroadcastMessage("myTest"); # <-- button 2 朝物体和全部子物体发送消息 } if (GUI.Button(new Rect(10, 200, 100, 50), "发送3")) {//this gameobjec‘parent SendMessageUpwards("myTest"); # <-- button 3 朝物体和上级父物体发送信息 } } }
using UnityEngine; using System.Collections; public class XXX : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnDrag(Vector2 delta) { Debug.Log("-------OnDrag--------"); } public void myTest() { Debug.Log("this is a methord:" + gameObject.name); } }
游戏对象 (GameObject)是全部其余组件 (Component) 的容器。游戏中的全部对象本质上都是游戏对象 (GameObject)。
Ref: http://blog.csdn.net/linuxheik/article/details/37956243
游戏对象 (GameObject) 自身不会向游戏添加任何特性。而是容纳实现实际功能的组件 (Component) 的容器。
例如,光 (Light) 是一个附加到游戏对象 (GameObject) 的组件 (Component)。
附加到游戏对象 (GameObject) 的组件 (Component)
# 注意前后顺序
若是要从脚本建立组件 (Component),则应
- 建立空游戏对象 (GameObject),
- 而后使用 gameObject.AddComponent(ClassName) 函数添加所需组件 (Component)。
在脚本中,组件 (Component) 能够方便地经过消息发送或 GetComponent(TypeName) 函数相互通讯。这使您能够编写可重复使用的小脚本,这些脚本能够附加到多个游戏对象 (GameObject) 并重复用于不一样用途。
除了做为组件 (Component) 的容器以外,游戏对象 (GameObject) 还具备标记 (Tag)、层 (Layer) 和名称 (Name)。
标记 (Tag) 和层 (Layer) 可使用标记管理器 (Tag Manager)(在编辑 (Edit) ->项目设置 (Project Settings) -> 标记 (Tags) 中)进行设置。
//获取按钮游戏对象 GameObject btnObj = GameObject.Find ("Canvas/Button");
//获取按钮脚本组件 Button btn = (Button) btnObj.GetComponent<Button>();
using UnityEngine; using UnityEngine.UI;![]()
public class Button_event_test : MonoBehaviour { public void Button_Click() { ... } }
Ref: Unity 脚本基类 MonoBehaviour 与 GameObject 的关系
1.1. 内置函数列表
Awake:当一个脚本被实例化时,Awake 被调用。咱们大多在这个类中完成成员变量的初始化。
Start:仅在 Update 函数第一次被调用前调用。由于它是在 Awake 以后被调用的,咱们能够把一些须要依赖 Awake 的变量放在Start里面初始化。 同时咱们还大多在这个类中执行 StartCoroutine 进行一些协程的触发。要注意在用C#写脚本时,必须使用 StartCoroutine 开始一个协程,可是若是使用的是 JavaScript,则不须要这么作。
Update:当开始播放游戏帧时(此时,GameObject 已实例化完毕),其 Update 在 每一帧 被调用。
LateUpdate:LateUpdate 是在全部 Update 函数调用后被调用。
FixedUpdate:当 MonoBehaviour 启用时,其 FixedUpdate 在每一固定帧被调用。
OnEnable:当对象变为可用或激活状态时此函数被调用。
OnDisable:当对象变为不可用或非激活状态时此函数被调用。
OnDestroy:当 MonoBehaviour 将被销毁时,这个函数被调用。
详见图:生命周期示意图
接下来,作出一下讲解:
最早执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码。
通常能够在这个地方将当前脚本禁用:this.enable=false,若是这样作了,则会直接跳转到OnDisable方法执行一次,而后其它的任何方法,都将再也不被执行。
若是当前脚本处于可用状态,则正常的执行顺序是继续向下执行OnEnable。
固然咱们能够在另一个脚本中实现这个脚本组件的启动:this.enable=true;
再向下执行,会进行一个判断,若是Start方法尚未被执行,则会被执行一次,若是已经被执行了,则不会再被执行。
这是个什么意思呢?咱们能够在某个脚本中将组件禁用this.enable=false,再启用时会转到OnEnable处执行,这时继续向下走,发现Start执行过了,将再也不被执行。
好比说:第一次启用时,将怪物的初始位置定在了(0,0,0)点,而后怪物可能会发生了位置的变换,后来被禁用了,再次启用时,不会让怪物又回到初始的(0,0,0)位置。
继续向后执行,就是Update了,而后是FixUpdate,再而后是LateUpdate,若是后面写了Reset,则会又回到Update,在这4个事件间能够进行循环流动。
再向后执行,就进入了渲染模块(Rendering),很是重要的一个方法就是OnGUI,用于绘制图形界面。【固然,若是你使用了NGUI,这个生命周期的事情你就不用考虑了】
首先咱们说说GUI与NGUI的区别,
GUI是Unity自带的绘制界面工具,它的成像原理是基于表层的,因此执行效率很是的低,而且没有提供复杂的UI的接口,就算开发者硬着头皮写上去只能让UI的执行效率更低。
NGUI 彻底依赖于3D就比如在游戏世界中的摄像机直直的照射在一个平面中,在平面之上再去绘制本身的UI,因此它的执行效率会很是高。
NGUI是一款收费的插件,在Asset Store中你们能够看到价格。在未购买正版的前提下咱们能够经过两种方法来使用NGUI,
再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy。当被禁用(enable=false)时,会执行OnDisable方法,可是这个时候,脚本并不会被销毁,在这个状态下,能够从新回到OnEnable状态(enable=true)。
当手动销毁或附属的游戏对象被销毁时,OnDestroy才会被执行,当前脚本的生命周期结束。
特别要强调的是:这里虽然可使用C#来写代码,可是这个类构造对象的生命周期,与MonoBehaviour的生命周期,是彻底不一样的。
Update
当 MonoBehaviour 实例化完成以后,Update 在每一帧被调用。
LateUpdate
LateUpdate 是在全部 Update 函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机能够在LateUpdate里实现。
FixedUpdate
处理 Rigidbody 时,须要用FixedUpdate代替Update。例如:给刚体加一个做用力时,你必须应用做用力在FixedUpdate里的固定帧,而不是Update中的帧。(二者帧长不一样)
Awake
Awake 用于在游戏开始以前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次。Awake 在全部对象被初始化以后调用,因此你能够安全的与其余对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。每一个游戏物体上的Awke以随机的顺序被调用。所以,你应该用Awake来设置脚本间的引用,并用Start来传递信息Awake老是在Start以前被调用。它不能用来执行协同程序。
C#和Boo用户注意:Awake 不一样于构造函数,物体被构造时并无定义组件的序列化状态。Awake像构造函数同样只被调用一次。
Start
Start在behaviour的生命周期中只被调用一次。它和 Awake 的不一样是,Start 只在脚本实例被启用时调用。你能够按需调整延迟初始化代码。Awake 老是在Start以前执行。
OnMouseEnter /OnMouseOver / OnMouseExit / OnMouseDown / OnMouseUp / OnMouseDrag
当鼠标进入 / 悬浮 / 移出 / 点击 / 释放 / 拖拽GUIElement(GUI元素)或Collider(碰撞体)中时调用OnMouseEnter。
OnTriggerEnter / OnTriggerExit / OnTriggerStay
当Collider(碰撞体)进入 / 退出 / 停留在 trigger(触发器)时调用OnTriggerEnter。OnTriggerStay 将会在每一帧被调用。
OnCollisionEnter / OnCollisionExit / OnCollisionStay
当此collider/rigidbody触发另外一个rigidbody/collider时,被调用。OnCollisionStay 将会在每一帧被调用。
Invoke function Invoke (methodName : string, time : float) : void 在 time 秒以后,调用 methodName 方法; InvokeRepeating function InvokeRepeating (methodName : string, time : float, repeatRate : float) : void 从第一次调用开始,每隔repeatRate时间调用一次. CancelInvoke function CancelInvoke () : void 取消这个MonoBehaviour上的全部调用Invoke。 IsInvoking function IsInvoking (methodName : string) : bool 某指定函数是否在等候调用。 StartCoroutine function StartCoroutine (routine : IEnumerator) : Coroutine 一个协同程序在执行过程当中,能够在任意位置使用 yield 语句。yield 的返回值控制什么时候恢复协同程序向下执行。协同程序在对象自有帧执行过程当中堪称优秀。协同程序在性能上没有更多的开销。StartCoroutine函数是马上返回的,可是yield能够延迟结果。直到协同程序执行完毕。 StopCoroutine / StopAllCoroutines
* 实例化
被显式添加到 Hierarchy 中的 GameObject 会被最早实例化,GameObject 被实例化的顺序是从下往上。
GameObject 被实例化的同时,加载其组件 component 并实例化,
若是挂载了脚本组件,则实例化脚本组件时,将调用脚本的 Awake 方法,组件的实例化顺序是也是从下往上。
在全部显式的 GameObject 及其组件被实例化完成以前,游戏不会开始播放帧。
* 实例化后
当 GameObject 实例化工做完成以后,将开始播放游戏帧。每一个脚本的第一帧都是调用 Start 方法,其后每一帧调用 Update,并且每一个脚本在每一帧中的调用顺序是从下往上。
* 总结
被挂载到 GameObject 下面的脚本会被实例化成 GameObject 的一个成员。
* 脚本与GameObject的关系
详见连接内容
NB: Unity 编辑器里面的拖拽绑定方式是 GameObject 级别的。