ngui 点击穿透按钮穿透到场景的问题,求助

NGUI使用教程(2) 使用NGUI创建2D场景并且添加标签和按钮 - 推酷
NGUI使用教程(2) 使用NGUI创建2D场景并且添加标签和按钮
1.创建2D场景
要使用NGUI创建2D场景,首先咱们必须新建一个项目,并且导入NGUI作为这个项目的插件,相信如果看过上一篇教程都知道怎么导入NGUI了,这里就不赘述,如果有疑问的可以去看上一篇教程。这里我已经导入成功了。在菜单中可以看到NGUI的菜单
在工程面板中可以看到有NGUI的文件夹
接下来咱们可以点击菜单中的【NGUI】--&【Create】--&【2D UI】,创建成功后在Hierarchy面板中可以看到多了一个UI Root
点开UI Root可以看到UI Root底下有一个Camera
这样在一个场景中就有两个摄像机了,我们删除Main Camera,在Hierarchy面板中就只有一个UIRoot和Camera了,这就是一个2D场景。我们保存一下这个场景,首先我们在Assets文件夹下面新建一个文件夹将这个文件夹命名为example
在菜单中【File】--&【Save Scene】将场景保存在example中命名为e01,这样我们就可以看到example文件夹下多了e01文件。
2.创建一个Panel
要在场景中添加标签和按钮,首先必须有个容器来盛放这些元件,所以咱们新建一个Panel。在Hierarchy面板中选择Camera,然后菜单中点击【NGUI】--&【Create】--&【Panel】这样就成功创建了一个Panel。
3.创建一个Label和Button
在菜单中点击【NGUI】--&【Open】--&【Widget Wizard(Legacy)】会弹出Widget Tool(小工具)面板
但是此时Add To按钮是灰色,点不了需要给Widget Tool添加Atlas(图集)和Font(字体),这样Add To按钮就变成了绿色可点击了。
在Template中选择Label,Add To 按钮后面的选择Panel,点击Add To这样就在Panel下面生成了一个Label。
在Template中选择Button,Add To 按钮后面的选择Panel,这个时候如果Altas中没有指定图集的话Add To按钮是灰色的。点击Atlas下拉菜单选择一个图集,这里我们选择Wooden Atlas,
点击Add To按钮这样就生成了一个Button.
但是我们看到按钮中只有文字没有图片,需要为按钮的Background指定一个图片点开Button按钮选择Background,在Inspector面板中UISprite(scrpit)点击Sprite会弹出一个选择界面
选择Wooden Background这样按钮就有了背景。但是Label和Button重合在一起,移动一下他们的位置即可。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
比如说我用NGUI制作了一个背包
然后我用鼠标点击地板控制角色的移动
但是当我点击了背包的UI的时候角色会相应移动的事件
这样的问题该怎么解决?
我用层去判断没有效果,用了UICamera.hoveredObject==null也没有作用 请问还有什么方法有效呢?
if (UICamera.isOverUI)
if (!camera.pixelRect.Contains(Input.mousePosition))
foreach (CameraCT item in list)
if (item == this)
if (item.camera.pixelRect.Contains(Input.mousePosition) && item.camera.depth > camera.depth)
这3个判断应该常驻你的相机控制代码里
第一个是判断UI层的
第二个是判断鼠标是否在相机区域的
第三个是出现相机重叠屏蔽底层相机交互的
希望能帮到你
给背包的UI加一个碰撞器。。这样当点击到UI时,下面的场景就不会接收到事件了。
你用层判断,然后那个射线是从NGUI的camera发出的。。
另外,你可以根据当前是否打开的背包去判断是否响应移动吧?
这个就应该用Layer去判断,如果点击UI层就返回不做处理。
要回复问题请先或
浏览: 1489
关注: 5 人解决切换场景时NGUI图集资源未释放的问题 - 推酷
解决切换场景时NGUI图集资源未释放的问题
使用unity3d编辑器,在切换场景的时候,NGUI的图集没有释放造成内存不足游戏闪退的问题。
默认情况下,unity3d切换场景之后会释放不用的内存,即内部会调用Resources.UnloadUnusedAssets从而释放未被引用的资源。
问题是,从编辑器的Profiler查看内存使用情况,发现NGUI的图集并没有被释放。
解决办法:
1.UnloadUnusedAssets 只会在资源没有引用的时候才会有效,包括脚本中静态变量的引用。我们在关闭任何界面的时候,将界面静态变量的引用设置为null。
2.不要在编辑器中观察内存使用情况。有些编辑器相关代码会引用资源,从而让资源不能释放。例如,如果你从Project目录打开了某个Profab的子对象,那么这个Profab会被编辑器加载到内存(如果编辑器不加载这个对象,编辑器怎么可能知道这个对象有哪些子对象)。也就是说,我们可以将游戏打包成windows版本,再观察游戏的内存情况。
3.老版本的NGUI内部可能会有静态变量对资源 的引用,一般升级NGUI会解决这些问题。
成功解决游戏过程中闪退的问题。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致NGUI 多场景情况下 管理多个界面 - dove11kiss - 推酷
NGUI 多场景情况下 管理多个界面 - dove11kiss
我们的游戏场景分布是这样的情况: 注册/登陆界面 所在的场景A,游戏场景B、世界场景C、战斗场景D。
为了便于界面的管理(比如,你打开界面1-&界面2-&界面3,然后又跳转来跳转去的,这个时候如果将所有界面继承一个基类UIBase,然后保存在一个字典里,显示一个全屏界面就可以用一个for循环解决);
主要的做法就是:将所有的界面都放在A场景中,游戏一开始先加载场景A,然后所有的界面(UIRoot)都在同一个游戏对象下(比如叫AllUIGameObject),然后在代码里DontDestroyOnLoad(AllGameObject),这样切换到其他场景(B、C、D)时,界面可以得以继续存在,如果再返回A场景(比如切换账号回到登陆界面的情况下),这个时候因为又要重头开始走登陆的流程,上一个账号的数据很多都无效了,因此Destroy掉前面的AllUIGameObject对象(当然有一些角色的数据如果用了static或者单体等保存下来的话,还是要动态的去重置的),再重新按照上述的步骤加载场景A走相同的流程就可以了(这里的指的流程简单的就指下面的LaunchGame.cs脚本中的start()函数)。
因为使用DestroyOnLoad(Obj),来回切换obj所在的场景时,会出现多份Obj的克隆,为此,在网上搜了一些方法,比如用个标志位来判断是否已经克隆,或者用单例判断Obj是否已经被初始化过,但都一样会出现重复Obj的情况!因此改为了上述所说的思路。
LaunchGame.cs:
1 using UnityE
3 public class LaunchGame : MonoBehaviour
public GameObject mAllUIGameObject = null;
private static LaunchGame mInstance = null;
public static LaunchGame Instance
private set
void Start ()
if (mInstance == null)
Output.Log(&LaunchGame.Start(), mInstance == null&);
mInstance = this;
DontDestroyOnLoad(mAllUIGameObject);
UIManager.Instance.Init();
Output.Log(&LaunchGame.Start()&);
void Update ()
public void DestroyAllUIGameObject()
Destroy(mAllUIGameObject);
UIManager.cs:
1 using System.Collections.G
3 // 面板类型
4 public enum UIType
12 // 界面逻辑管理器
13 public class UIManager : Singleton&UIManager&
public UI1 ui1 = null;
public UI2 ui2 = null;
public UI3 ui3 = null;
public UI4 ui4 = null;
Dictionary&UIType, UIBase& mUIDic = new Dictionary&UIType, UIBase&();
// 初始化界面逻辑
public void Init()
CheckMembers();
InitAllPanel();
// 检测成员变量是否有效
void CheckMembers()
Assert.IsNotNull(ui1, &UIManager.CheckMembers(), ui1 is null object!&);
Assert.IsNotNull(ui2, &UIManager.CheckMembers(), ui2 is null object!&);
Assert.IsNotNull(ui3, &UIManager.CheckMembers(), ui3 is null object!&);
Assert.IsNotNull(ui4, &UIManager.CheckMembers(), ui4 is null object!&);
// 初始化所有面板
void InitAllPanel()
mUIDic.Add(UIType.UI1, ui1);
mUIDic.Add(UIType.UI2, ui2);
mUIDic.Add(UIType.UI3, ui3);
mUIDic.Add(UIType.UI4, ui4);
foreach (UIBase ui in mUIDic.Values)
if (ui.m_panel != null)
ui.CheckWidget();
ui.Init();
ui.BindingEvent();
ui.Reset();
// 显示指定面板
public void ShowPanel(UIType type)
foreach (KeyValuePair&UIType, UIBase& item in mUIDic)
if (type == item.Key)
item.Value.Show();
item.Value.Hide();
其他脚本(诸如UI1..UI4、UIBase)就不贴了,都没什么,在SceneA-&SceneB-&SceneC都是用Application.LoadLevel(),而在Scene X -& SceneA之前,就会调用LaunchGame.cs中的函数DestroyAllUIGameObject(),然后才LoadLevel(场景A)。
以上就是大致思路及实现,如果存在不好的方面,麻烦告知,不胜感激!
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 ngui 穿透 的文章

更多推荐

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

点击添加站长微信