[Unity3D] 03 - Component of UI

还需进一步整理!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); } }

 

  • 登录界面设计的重要事项
  1. 密码
  2. 字符规则断定(正则表达式)

 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 () { } }

 

 

 

Canvas

  • 大小,inspector
  • 加图片:Canvas 自己是个框架,没有背景图案也就没有Texture。--> 内部添加panel

 

Panel

加图片:编辑器

 

 

 

 

//用户名
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

  1. BroadcastMessage 广播消息
  2. SendMessage 发送消息
  3. SendMessageUpwards 向上发送消息

 

MonoBehaviour 是 Unity 中全部脚本的基类

  • 若是你使用JS的话,脚本会自动继承MonoBehaviour。
  • 若是使用C#的话,你须要显式继承MonoBehaviour。

 

  • 发送消息
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)

游戏对象 (GameObject) 自身不会向游戏添加任何特性。而是容纳实现实际功能的组件 (Component) 的容器。

例如,光 (Light) 是一个附加到游戏对象 (GameObject) 的组件 (Component)。

附加游戏对象 (GameObject)组件 (Component)

# 注意前后顺序

若是要从脚本建立组件 (Component),则应

  1. 建立空游戏对象 (GameObject),
  2. 而后使用 gameObject.AddComponent(ClassName) 函数添加所需组件 (Component)。  

 

在脚本中,组件 (Component) 能够方便地经过消息发送或 GetComponent(TypeName) 函数相互通讯。这使您能够编写可重复使用的小脚本,这些脚本能够附加到多个游戏对象 (GameObject) 并重复用于不一样用途

除了做为组件 (Component) 的容器以外,游戏对象 (GameObject) 还具备标记 (Tag)、层 (Layer) 和名称 (Name)。

  • 标记 (Tag) 用于经过标记 (Tag) 名称来快速查找对象。
  • 层 (Layer) 可用于仅对某些特定的对象组投射光线、渲染或应用光照。
  • 名称 (Name)

标记 (Tag) 和层 (Layer) 可使用标记管理器 (Tag Manager)(在编辑 (Edit) ->项目设置 (Project Settings) -> 标记 (Tags) 中)进行设置。

 
 

实例 ( GameObject and GetComponent )

-- Object --

套路:得到object,顶层结构,而后再按照它原本的面貌GetComponent出来。  
//获取按钮游戏对象
GameObject btnObj = GameObject.Find ("Canvas/Button");
//获取按钮脚本组件 Button btn = (Button) btnObj.GetComponent<Button>();

 

--  MonoBehaviour --

using UnityEngine;
using UnityEngine.UI;
  
public class Button_event_test : MonoBehaviour {

    public void Button_Click()
    {
        ...
    }
}

 

 

MonoBehaviour 与 GameObject 的关系

Ref: Unity 脚本基类 MonoBehaviour 与 GameObject 的关系

 

1、MonoBehaviour 生命周期

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 将被销毁时,这个函数被调用。
View Code

详见图:生命周期示意图

 

接下来,作出一下讲解:

最早执行的方法是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,

  • 第一种:使用官方提供的免费版本,可是这个版本中有NGUI的水印,没法正式发布不过彻底能够做为学习使用。
  • 第二种:使用别人购买过的正版插件,在互联网中有朋友放出NGUI的插件。

 

再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisableOnDestroy。当被禁用(enable=false)时,会执行OnDisable方法,可是这个时候,脚本并不会被销毁,在这个状态下,能够从新回到OnEnable状态(enable=true)。

当手动销毁或附属的游戏对象被销毁时,OnDestroy才会被执行,当前脚本的生命周期结束。

特别要强调的是:这里虽然可使用C#来写代码,可是这个类构造对象的生命周期,与MonoBehaviour的生命周期,是彻底不一样的。

 

2、MonoBehaviour 的那些坑

  • 私有(private)和保护(protected)变量只能在专家模式中显示。属性不被序列化或显示在检视面板。 
  • 不要使用命名空间(namespace) 
  • 记得使用 缓存组件查找, 即在MonoBehaviour的长远方法中常常被访问的组件最好在把它看成一个私有成员变量存储起来
  • 在游戏里常常出现须要检测敌人和我方距离的问题,这时若是要寻找全部的敌人,显然要消耗的运算量太大了,
    • 因此最好的办法是将攻击范围使用Collider表示,而后将Collider的isTrigger设置为True。
    • 最后使用OnTriggerEnter来作攻击范围内的距离检测,这样会极大提高程序性能。

 

3、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
不可重写函数

 

4、脚本与GameObject的关系

* 实例化

被显式添加到 Hierarchy 中的 GameObject 会被最早实例化,GameObject 被实例化的顺序是从下往上。

GameObject 被实例化的同时,加载其组件 component 并实例化,

若是挂载了脚本组件,则实例化脚本组件时,将调用脚本的 Awake 方法,组件的实例化顺序是也是从下往上。

在全部显式的 GameObject 及其组件被实例化完成以前,游戏不会开始播放帧

 

* 实例化后

当 GameObject 实例化工做完成以后,将开始播放游戏帧。每一个脚本的第一帧都是调用 Start 方法,其后每一帧调用 Update,并且每一个脚本在每一帧中的调用顺序是从下往上。

 

* 总结

被挂载到 GameObject 下面的脚本会被实例化成 GameObject 的一个成员

 

* 脚本与GameObject的关系

详见连接内容

NB: Unity 编辑器里面的拖拽绑定方式是 GameObject 级别的。

相关文章
相关标签/搜索