unity3d ugui教程 ugui removelistener 何时调用

uGUI练习(七) Drag And Drop-不解
一、相关组件
EventTrigger
Canvas Group
ScrollRect
二、拖放练习 1、创建一个Panel,命名Panel1,添加EventTrigger组件,稍稍改一下Panel的颜色
2、Panel1下创建一个Text,输入”Test Draggable\n&&&&&& object”,设置字体颜色及Text超出处理
3、在 一文中,已经大概了解uGUI的EventSystem,需要继承三个事件接口,接下来我们创建一个DragDropScene.cs,代码如下:using UnityE using System.C using UnityEngine.UI; using UnityEngine.EventS public class DragDropScene : MonoBehaviour,IDragHandler,IPointerDownHandler,IPointerUpHandler { public void OnDrag(PointerEventData eventData) { GetComponent&RectTransform&().pivot.Set(0,0); transform.position=Input.mouseP } public void OnPointerDown(PointerEventData eventData) { transform.localScale=new Vector3(0.7f,0.7f,0.7f); } public void OnPointerUp(PointerEventData eventData) { transform.localScale=new Vector3(1f,1f,1f); } } 4、上面的代码就是 按下,拖动,抬起 这三个事件的处理.把这个脚本绑定在Panel1,按Ctrl+P 运行游戏,在Game视图我们就可以拖动Panel1了.
5、选中创建好的Panel1,按Ctrl+D Copy 几个Panel,更改成不同的颜色,如下图所示:
6、在上面的步骤中,我们创建了几个Panel1,并且给它们都绑定了DragDropScene.cs,但还没有实现Drop的事件; 接下来,我们创建一个Panel,命名DropPanel,用来作停放Panel的容器 7、在DropPanel下创建一个Panel,命名Grid,并给它添加Grid Layout Group和Canvas Group组件
8、为了让我们知道Drop是可以停放的,我们在Grid下创建两个Panel,同样的给它们绑定DragDropScene.cs,如下图:
9、接下来就是把Panel,拖动并停放在DropPanel下,如下图所示
10、打开DragDropScene.cs脚本,添加一行,并修改OnPointerDown(),OnPointUp( )[SerializeField] GameObject grid=null,rootCanvas=public void OnPointerDown(PointerEventData eventData) { transform.localScale=new Vector3(0.7f,0.7f,0.7f); transform.parent=rootCanvas. }
public void OnPointerUp(PointerEventData eventData) { transform.localScale=new Vector3(1f,1f,1f); RaycastHit2D hit = Physics2D.Raycast(Input.mousePosition,-Vector2.up); if (hit.collider != null) { //如果射线检测到的gameobject为grid,就把当前Panel放在grid节点下 if(hit.collider.gameObject.name==&Grid&) transform.parent=grid. } }上面的代码,当鼠标抬起时,如果是在Grid的上方,就把当前Panel设置在Grid下,鼠标按下时,设置当前Panel的Parent为rootCanvas11、为DragDropScene设置参数值: &12、到这一步,我们就可以拖动Panel放到Grid下了,为了避免Grid下的Panel超出,在一文中我们使用了SrollRect和Mask.所以现在我们就给DropPanel添加上这两个组件,当然最后也可以给DropPanel添加Scrollbar
三、CanvasGroup CanvasGroup是一个容器,可以用来改变child的Alpha,Raycasting,Enable state. 可以用来改变child元素的state. 比如:在一段时间内window变淡,在同一个group里的child元素的alpha值也会受到影响,alpha 值=任何嵌套的group相乘。乘以canvas元素的alpha值. CanvasGroup 可以配置为不遮挡 射线(在这个group里的任何物件都不用为图形射线考虑) ,并且元素是否相互作用. 四、EventTrigger 从事件系统接收事件并调用每一个已注册的事件. 在每一个特殊的函数中,都可以使用EventTrigger,你可以在一个事件上注册多个函数,当EventTrigger接收事件时,将按提供的顺序调用. 注意:将EventTrigger组件绑定在任何Gameobject上之后,它将拦截一切事件,并在这个对象上没有冒泡事件出现. 五、Drag && Drop 效果
同步自网易博客
很喜欢此文字
很喜欢此文字
很喜欢此文字
很喜欢此文字
很喜欢此文字
转载了此文字
很喜欢此文字
很喜欢此文字
很喜欢此文字
很喜欢此文字
转载了此文字Blue Path 简约iOS7风格智力游戏
Unravel Line 色彩解密游戏
Scribbles Ball 物理弹性游戏
uGUI使用代码动态添加Button.OnClick()事件(Unity3D开发之十二)
uGUI使用代码动态添加Button.OnClick()事件(Unity3D开发之十二)
围观6607次
编辑日期: 字体:
6,606 views
猴子原创,欢迎转载。转载请注明: 转载自,谢谢!
猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
原文地址: http://blog.csdn.net/cocos2der/article/details/
uGUI出来这么久了,也一直没好好用用,主要是公司项目不用U3D。昨晚用了下Button,还是比较爽的。
主要说下用代码添加button.OnClick()事件的方法(使用属性面板添加的方法就不说了)
一、创建2D UI Panel,添加你需要的Button。
我添加了3个Button:BtnStart,BtnShop,BtnLeaderboards。
二、添加脚本
using UnityE
using System.C
using System.Collections.G
using UnityEngine.E
using UnityEngine.UI;
public class MainMenu : MonoBehaviour {
// Use this for initialization
void Start () {
List&string& btnsName = new List&string&();
btnsName.Add("BtnPlay");
btnsName.Add("BtnShop");
btnsName.Add("BtnLeaderboards");
foreach(string btnName in btnsName)
GameObject btnObj = GameObject.Find(btnName);
Button btn = btnObj.GetComponent&Button&();
btn.onClick.AddListener(delegate() {
this.OnClick(btnObj);
public void OnClick(GameObject sender)
switch (sender.name)
case "BtnPlay":
Debug.Log("BtnPlay");
case "BtnShop":
Debug.Log("BtnShop");
case "BtnLeaderboards":
Debug.Log("BtnLeaderboards");
Debug.Log("none");
// Update is called once per frame
void Update () {
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
using UnityEngine;&&using System.Collections;&&using System.Collections.Generic;&&using UnityEngine.Events;&&using UnityEngine.UI;&&&&&&public class MainMenu : MonoBehaviour {&&&&&&&&// Use this for initialization&&&&&&void Start () {&&&&&&&&&&List&string& btnsName = new List&string&();&&&&&&&&&&btnsName.Add("BtnPlay");&&&&&&&&&&btnsName.Add("BtnShop");&&&&&&&&&&btnsName.Add("BtnLeaderboards");&&&&&&&&&&&&foreach(string btnName in btnsName)&&&&&&&&&&{&&&&&&&&&&&&&&GameObject btnObj = GameObject.Find(btnName);&&&&&&&&&&&&&&Button btn = btnObj.GetComponent&Button&();&&&&&&&&&&&&&&btn.onClick.AddListener(delegate() {&&&&&&&&&&&&&&&&&&this.OnClick(btnObj);&& &&&&&&&&&&&&});&&&&&&&&&&}&& &&&&}&&&&&&&&public void OnClick(GameObject sender)&&&&&&{&&&&&&&&&&switch (sender.name)&&&&&&&&&&{&&&&&&&&&&case "BtnPlay":&&&&&&&&&&&&&&Debug.Log("BtnPlay");&&&&&&&&&&&&&&break;&&&&&&&&&&case "BtnShop":&&&&&&&&&&&&&&Debug.Log("BtnShop");&&&&&&&&&&&&&&break;&&&&&&&&&&case "BtnLeaderboards":&&&&&&&&&&&&&&Debug.Log("BtnLeaderboards");&&&&&&&&&&&&&&break;&&&&&&&&&&default:&&&&&&&&&&&&&&Debug.Log("none");&&&&&&&&&&&&&&break;&&&&&&&&&&}&&&&&&}&&&&&&&&&&&&// Update is called once per frame&&&&&&void Update () {&&&&&&&&&&&&}&&}&&
ok,测试一下,可以玩耍了。
==================
更新 ======================
有人问道如果是Toogle如果添加呢?其实很简单的。
// Add click listenner for buttons
Hashtable btnsName = new Hashtable();
btnsName.Add("BtnNewGame", "Button");
btnsName.Add("BtnContinue", "Button");
btnsName.Add("BtnChallenge", "Button");
btnsName.Add("BtnMoreGame", "Button");
btnsName.Add("BtnRank", "Button");
btnsName.Add("BtnMusic", "Toggle");
btnsName.Add("BtnSound", "Toggle");
foreach(DictionaryEntry btnInfo in btnsName)
GameObject btnObj = GameObject.Find(btnInfo.Key as string);
if (btnInfo.Value == "Button") {
Button btn = btnObj.GetComponent&Button&();
btn.onClick.AddListener(delegate() {
// this.OnClick(btnObj);
else if (btnInfo.Value == "Toggle") {
Toggle btn = btnObj.GetComponent&Toggle&();
btn.onValueChanged.AddListener(delegate(bool isOn) {
// this.OnValueChanged(isOn, btnObj);
12345678910111213141516171819202122232425
// Add click listenner for buttons&&&&&&&&&&Hashtable btnsName = new Hashtable();&&&&&&&&&&btnsName.Add("BtnNewGame", "Button");&&&&&&&&&&btnsName.Add("BtnContinue", "Button");&&&&&&&&&&btnsName.Add("BtnChallenge", "Button");&&&&&&&&&&btnsName.Add("BtnMoreGame", "Button");&&&&&&&&&&btnsName.Add("BtnRank", "Button");&&&&&&&&&&btnsName.Add("BtnMusic", "Toggle");&&&&&&&&&&btnsName.Add("BtnSound", "Toggle");&&&&&&&&&&foreach(DictionaryEntry btnInfo in btnsName)&& &&&&&&&&{&&&&&&&&&&&&&&&&GameObject btnObj = GameObject.Find(btnInfo.Key as string);&&&&&&&&&&&&&&&&if (btnInfo.Value == "Button") {&&&&&&&&&&&&&&&&&&Button btn = btnObj.GetComponent&Button&();&&&&&&&&&&&&&&&&&&&&btn.onClick.AddListener(delegate() {&&&&&&&&&&&&&&&&&&&&&&&&// this.OnClick(btnObj);&&&& &&&&&&&&&&&&&&&&});&& &&&&&&&&&&&&}&&&&&&&&&&&&&&else if (btnInfo.Value == "Toggle") {&&&&&&&&&&&&&&&&&&Toggle btn = btnObj.GetComponent&Toggle&();&&&&&&&&&&&&&&&&&&&&btn.onValueChanged.AddListener(delegate(bool isOn) {&&&&&&&&&&&&&&&&&&&&&&// this.OnValueChanged(isOn, btnObj);&&&&&&&&&&&&&&&&&&});&&&&&&&&&&&&&&}&&&&&&&&&&}&&
本文固定链接:
转载请注明:
作者:Houzi
Write the code. Change the world.
如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!
您可能还会对这些文章感兴趣!Unity学习笔记(一) UGUI - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了1272字,被3人关注,获得了2个喜欢
Unity学习笔记(一) UGUI
Canvas组件可以认为是放置UI的一个抽象空间。所有的UI元素都必须依附于某个Canvas中。Canvas可以嵌套一个或多个Canvas,并且以级联的方式影响到子节点。
1.1 Canvas RenderMode
ScreenSpace - OverlayCanvas自动适配屏幕大小,不经过投影空间,直接在屏幕上绘制,即使场景中没有任何Camera也可以呈现出Canvas中的内容。Ps.这种方式可以单纯的制作纯2D游戏。
ScreenSpace - CameraCanvas自动适配屏幕大小,UI由特定的Camera负责渲染,Camera投影方式可设定为Perspective(透视)或者Orthographic(正交)。Ps.这种RenderMode可以制作复杂的UI系统,例如在UI中显示3D模型。
WorldSpaceCanvas不自动适配屏幕大小,UI将以平面物体对待,可以放在场景中其他物体的后面,UI在屏幕中显示的大小由它和Camera之间的距离所决定。Ps.这种RenderMode可以制作复杂的UI系统,例如角色头上的血条。
2.1 CanvasScaler
1. Reference Resolution:参考分辨率,UI设计尺寸。2.
ScaleMode:
(1). ConstantPixelSize:无论屏幕分辨率如何变化,UI元素的大小不变。
(2). ScaleWithScreenSize:该模式又分为三种
Shrink:保持缩放比例,裁切
Expand:缩放不裁切
Match With Screen Size:
如果是Match Width, 那么就是适配宽度,把宽度设置为屏幕宽度,然后保持比例
如果是Match height,那么适配高度,首先把高度设置为屏幕高度,然后保持比例
(3). ConstantPhysicalSize:根据屏幕的PPI信息和ConstantPhysicalSize本身的配置信息,得出一个“合适”的scaleFactor,以达到UI在不同PPI设备上的最终大小都是一致的。
2.2 RectTransform
继承自Transform,当创建一个UI组件时,Transform会自动转换成RectTransform。
anchor:相对父矩形的锚点,由四个小花瓣(锚点)组成,分别对应父矩形的四个角。表示子矩形的四个角到父矩形四个角的比例关系。
pivot:中心点
3个重要的矩形:实在存在的父矩形、用于辅助的anchor矩形、实在存在的子矩形(当前矩形)。父矩形内部包含了anchor矩形和子矩形。图中,外框表示父矩形、“四叶花瓣尖”组成anchor矩形、蓝点表示子矩形。
3. 层级管理
同一Canvas内的层级关系
同一Canvas内,按照图中的所给出,越在上面的越显示在最后层。(因为UGUI是从上至下的顺序绘制的)
2.不同Canvas之间的层级关系
Camera.Depth -& Canvas.SotingLayer -& Canvas.OrderInLayer
如果Canvas的RenderMode是ScreenSpace.Overlay的话,那么他永远是在最前面的。Canvas的PlaneDistance(其实就是Canvas的Z轴)也会影响Canvas的层级。
4.UI交互事件
UI交互事件的实现方式有两总方式:
4.1、在组件上挂EventTrigger脚本,具体的EvenTriggerType详见。
4.2、通过继承IPointerXXXHandler接口
using UnityE
using System.C
using UnityEngine.EventS
public class LoginManger : MonoBehaviour, IPointerClickHandler {
public void OnPointerClick(PointerEventData eventData)
Debug.Log ("HEHE HAHA");
4.3、还有一些其他的方法:
4.3.1、Button自带委托方式
using UnityE
using System.C
using UnityEngine.UI;
public class BtnControl : MonoBehaviour {
// Use this for initialization
void Start ()
var button = transform.gameObject.GetComponent&Button&();
if (button != null)
button.onClick.RemoveAllListeners();
button.onClick.AddListener(onClick);
public void onClick()
Debug.Log("BtnControl .onClick()");
4.3.2、动态绑定EventTrigger
结合以上几种方法我们就可以实现一套统一的事件处理方案。详见示例 MyEventTrigger.cs
目的:热更新
在原有的Cocos2d_X项目中,C++和Lua通过栈互相通信。在Unity中C#和Lua怎么互相通信?
1、Questions
C#怎么调用C++?
C++怎么调用C#?
C#怎么调用Lua?
Lua怎么调用C#?
LuaInterface is a library for integration between the Lua language and Microsoft .NET platform's Common Language Runtime (CLR). Lua scripts can use it to instantiate CLR objects, access properties, call methods, and even handle events with Lua functions.
Ps. Auto translate by GoogleLuaInterface是Lua语言和Microsoft .NET平台的通用语言运行时(CLR)之间的集成库。 Lua脚本可以使用它来实例化CLR对象,访问属性,调用方法,甚至处理与Lua函数事件
也就是说通过LuaInterface我们可以实现C#和Lua之间的互调。
3、目前Unity中几种Lua化的解决方案slua -
、 UniLua -
4、为什么推荐使用uLua?
抛弃反射采用wrap生成代码的方式,效率上已经合sLua相差无几
已经有很多线上项目使用
DontDestroyOnLoad
如何在UI中显示3D模型
如何在3D世界中显示UI
1、UI框架2、AssetBundle3、纹理压缩
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
unity NGUI
UGUI相关知识
· 2人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:【unity3d 5.x】Unity3D中uGUI事件系统简述及使用方法总结_czx_main吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:2贴子:
【unity3d 5.x】Unity3D中uGUI事件系统简述及使用方法总结
Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值。如下图所示:
先以PointerClick为例。这个是用于某点点击事件。其他事件都可以根据相同的办法调用。
之所以使用PointerClick为例。是因为在最后笔者会提到一个特殊的实现方式。而相比于其他事件类型,有且仅有Click事件存在特殊实现。
我们要实现事件主要有3种方式:
方式一:继承基础接口实现
步骤一:创建ClickObject脚本。继承MonoBehaviour和IPointerClickHandler。
步骤二:实现public void OnPointerClick(PointerEventData eventData)方法:
步骤三:创建一个名为Panel_IPointer的空对象。并且将ClickObject脚本附加到对象上。
步骤四:启动,并点击Panel_IPointer对象。在Console输出如下:
一次新的奇迹玩法?你想成为霸服大魔王吗?
方式二:Unity3D编辑器操作设置实现
步骤一:创建一个C#脚本。在脚本中添加一个public方法。步骤二:创建一个命名为Empty的UI对象,用于接收和响应点击事件。创建一个名为Panel的UI对象,用于触发点击事件。 步骤三:Panel对象添加EventTrigger组件,& Add New& -& 选择& PointerClick&。将Empty对象拖拽到触发者位置。然后点击&No Function&选择我们写在Test脚本中的OnTestClick事件。
步骤四:设置好这些之后。我们的事件触发就已经完成了。运行Unity3D。点击窗口中Panel对象。Console输出内容如下:
方式三:程序动态设置实现我们在日常的开发中。可能需要动态的需要变更绑定的事件。那么我们如何才能使用C#代码控制绑定触发事件呢?下面我们就介绍代码控制。ScriptControl.cs脚本using System.Collections.Gusing UnityEusing UnityEngine.Eusing UnityEngine.EventSpublic class ScriptControl : MonoBehaviour {// Use this for initializationvoid Start (){var trigger = transform.gameObject.GetComponent&EventTrigger&();if (trigger == null)trigger = transform.gameObject.AddComponent&EventTrigger&();// 实例化delegatestrigger.delegates = new List&EventTrigger.Entry&();// 定义需要绑定的事件类型。并设置回调函数EventTrigger.Entry entry = new EventTrigger.Entry();// 设置 事件类型entry.eventID = EventTriggerType.PointerC// 设置回调函数entry.callback = new EventTrigger.TriggerEvent();UnityAction&BaseEventData& callback = new UnityAction&BaseEventData&(OnScriptControll);entry.callback.AddListener(callback);// 添加事件触发记录到GameObject的事件触发组件trigger.delegates.Add(entry);}// Update is called once per framevoid Update () {}public void OnScriptControll(BaseEventData arg0){Debug.Log(&Test Click&);}}
点击事件的特殊实现方式:使用Button控件实现
针对Click事件还存在一种特殊方式:uGUI系统中官方提供了一种Button控件。Button封装了官方提供的一套OnClick事件。操作完全类似于方式二。便不详述了。
使用Button我们可以实现动态的变更鼠标绑定的点击事件。如下代码所示:using UnityEusing System.Cusing UnityEngine.UI;public class BtnControl : MonoBehaviour {
// Use this for initialization
void Start ()
var button = transform.gameObject.GetComponent&Button&();
if (button != null)
button.onClick.RemoveAllListeners();
button.onClick.AddListener(TestClick);
public void TestClick()
Debug.Log(&Test Click. This is Type 4&);
// Update is called once per frame
void Update () {
相关源码下载:
贴吧热议榜
使用签名档&&
保存至快速回贴}

我要回帖

更多关于 removelistener 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信