unity3dngui ngui 有控制子物体之间的距离脚本吗

Unity3D 虚拟摇杆 NGUI实现方法
特此声明!对不起各位读者了,这是小生刚接触NGUI的做法,这些日子来才想起还写过了这篇博客,现在看来这篇博客的做法实在是SB,各位看到标题的读者也就不必看下去了,估计也没有时间去更新了,抱歉
首先呢,先声明一下哈,这个脚本从头到尾都是我自己设计和编写的哈,再加上今年就大四啦,所以要也开始镀一点金啦,所以呢,各位朋友也帮一下忙哈,能赞一个就赞一个哈,多多交流,共同进步哈,而且在您转载、修改、优化、使用的话,如果这几行字没碍着您的眼的话,留着也行哈。在代码中就是这几行哈。
* note 此代码原创为谭俊孟编写 note
* note 如果对此代码有什么好的意见或者建议 note
* note 请联系QQ: note
* note 或者发邮箱: note
* note 大家共同交流和进步 note
* note 现由XXX转载修改,优化并使用 note
因为我也刚接触Unity不久,自适应效果的框架还没来得急写,所以下面说一下这段代码需要的前期准备哈,不然数值不对就很容易出异常哈:
(1)NGUI的最基本操作要会哈,我也就刚刚学NGUI了几小时,也只是会创建一下控件而已哈,要用也得查查API哈。
(2)建一个摇杆移动范围的贴图(Texture),像这样那个半透明的圆形区域,,当然弄也行,这个就是好看一些哈,如果弄的话步骤是:准备一张你自己觉得好看的贴图,然后直接用NGUI建个Texture就行了,如果你的图片显示不是图片原有的效果,那可以尝试选择一下着色器(shader)的模式。
(3)准备你觉得合适的图片,然后用它创建一个图文集(Atlas);如果不会的话,那我就不教你啦,如果这个自己百度了还不会,那还是转行快点哈;话多了,不好意思。然后用这个图文集创建一个Button。
(4)这个需要修改的几个地方,1、这些Button自带代码的属性,JoyControl.cs就是我编写的代码,等会再细说哈。2、Button的碰撞器要改,把Box
Collider修改成这个。3、Button的Background的Scale设置一下,。
(5)代码的话应该有没有什么吧,我写了很多注释哈,如果实在看不懂,你们再留言,然后我再说哈。
using UnityE
using System.C
* note 此代码原创为谭俊孟编写 note
* note 如果对此代码有什么好的意见或者建议 note
* note 请联系QQ: note
* note 或者发邮箱: note
* note 大家共同交流和进步 note
* note 现由XXX转载修改,优化并使用 note
public class JoyControl : MonoBehaviour
public GameObject playerT
private float joyInitX;
//note 摇杆的圆心初始坐标X note
private float joyInitY;
//note 摇杆的圆心初始坐标Y note
private float joyMoveD //note 摇杆最大可移动的距离 note
private float currentD //note 单签摇杆圆心离初始圆心的距离 note
private float joyControlD //note 摇杆开始控制坦克移动的最小距离 note
private float mousePositionX; //note 鼠标相对NGUI坐标系的坐标X note
private float mousePositionY; //note 鼠标相对NGUI坐标系的坐标X note
private float parallelMoveLeftX; //note 摇杆控制坦克平行移动左边界X note
private float parallelMoveRightX; //note 摇杆控制坦克平行移动右边界X note
private float parallelMoveLeftY; //note 摇杆控制坦克平行移动左边界Y note
private float parallelMoveRightY; //note 摇杆控制坦克平行移动右边界X note
private bool isTankM
//note 摇杆是否能控制坦克移动 note
void Start ()
joyInitX = this.transform.localPosition.x;
joyInitY = this.transform.localPosition.y;
joyMoveDistance = 22.5f;
joyControlDistance = 5.0f;
mousePositionX = this.transform.localPosition.x;
mousePositionY = this.transform.localPosition.y;
parallelMoveLeftX = this.transform.localPosition.x - 5.0f;
parallelMoveRightX = this.transform.localPosition.x + 5.0f;
parallelMoveLeftY = this.transform.localPosition.y + 5.0f;
parallelMoveRightY = this.transform.localPosition.y - 5.0f;
void Update()
if(isTankMove)
//note 判断坦克是否在前后平行活动距离内 note
if(this.transform.localPosition.x & parallelMoveLeftX && this.transform.localPosition.x & parallelMoveRightX)
// note 坦克移动 note
if(this.transform.localPosition.y & joyInitY)
playerTank.transform.Translate(Vector3.forward * Time.deltaTime * getAbs(this.transform.localPosition.y, joyInitY) * playerTank.GetComponent&Tank&().tankMoveSpeed);
playerTank.transform.Translate(Vector3.back * Time.deltaTime * getAbs(this.transform.localPosition.y, joyInitY) * playerTank.GetComponent&Tank&().tankMoveSpeed);
else if(this.transform.localPosition.y & parallelMoveLeftY && this.transform.localPosition.y & parallelMoveRightY)
//note 横向拖动摇杆不做任何操作 note
//note 坦克移动和旋转 note
if(this.transform.localPosition.y & joyInitY)
playerTank.transform.Translate(Vector3.forward * Time.deltaTime * getAbs(this.transform.localPosition.y, joyInitY) * playerTank.GetComponent&Tank&().tankMoveSpeed);
if(this.transform.localPosition.x & joyInitX)
playerTank.transform.Rotate(Vector3.down * Time.deltaTime * getAbs(this.transform.localPosition.x, joyInitX) * playerTank.GetComponent&Tank&().tankRotateSpeed);
playerTank.transform.Rotate(Vector3.up * Time.deltaTime * getAbs(this.transform.localPosition.x, joyInitX) * playerTank.GetComponent&Tank&().tankRotateSpeed);
playerTank.transform.Translate(Vector3.back * Time.deltaTime * getAbs(this.transform.localPosition.y, joyInitY) * playerTank.GetComponent&Tank&().tankMoveSpeed);
if(this.transform.localPosition.x & joyInitX)
playerTank.transform.Rotate(Vector3.up * Time.deltaTime * getAbs(this.transform.localPosition.x, joyInitX) * playerTank.GetComponent&Tank&().tankRotateSpeed);
playerTank.transform.Rotate(Vector3.down * Time.deltaTime * getAbs(this.transform.localPosition.x, joyInitX) * playerTank.GetComponent&Tank&().tankRotateSpeed);
void OnDrag (Vector2 delta)
if(GameObject.Find("Main Camera").GetComponent&MyCamera&().cameraState == 1)
//note 摇杆随鼠标移动 note
mousePositionX = Input.mousePosition.x - (float)Screen.width / 2;
mousePositionY = Input.mousePosition.y - (float)Screen.height / 2;
this.transform.localPosition = new Vector3(mousePositionX, mousePositionY, 0);
// note 获得单签摇杆圆心离初始圆心的距离 note
currentDistance = Mathf.Sqrt(getAbs(this.transform.localPosition.x, joyInitX) * getAbs(this.transform.localPosition.x, joyInitX)
+ getAbs(this.transform.localPosition.y, joyInitY) * getAbs(this.transform.localPosition.y, joyInitY));
//note 判断摇杆移动距离是否超过最大距离,超过则设为最边沿的点 note
if(currentDistance & joyControlDistance)
isTankMove =
else if(currentDistance & joyMoveDistance)
setJoyMoveMaxPosition();
isTankMove =
isTankMove =
else if(GameObject.Find("Main Camera").GetComponent&MyCamera&().cameraState == 2)
* note 计算两个值的绝对值之差的绝对值 note
float getAbs(float a, float b)
return Mathf.Abs(Mathf.Abs(a)-Mathf.Abs(b));
* note 求摇杆可移动最大边界点的坐标 note
void setJoyMoveMaxPosition()
* note 移动鼠标控制摇杆超过规定距离,则摇杆保持以摇杆为圆心的当前两点的原斜率,长度为最大长度 note
* note 其中x,y为(joyInitX, joyInitY),而(x1,y1)为当前摇杆坐标,R为和joyMoveDistance note
* note (x2, y2)为最后要求的结果坐标,并且赋给当前的摇杆 note
* ntoe 算法: note
* note 由直线公式:y = kx + 推出k 和 b note
* note k = (y1 - y) / (x1 - x);
b = y - k * note
* note 再由园的公式(x2 - x)^2 + (y2 - y)^2 = R^2; note
* note 进行带入运算得出关于x2的一元二次方程: (x2 - x)^2 + (k * x2 + b - y)^2 = R^2; note
* note 整理后得出:(1 + k^2) * x2^2 + 2 * (k*b - k*y - x)x2 + x^2 + b^2 + y^2 - 2*b*y - R^2 = 0; note
* note 再根据求根公式:x=[-b±√(b^2-4ac)]/2a 和 当前摇杆坐标X与初始坐标X的比较可得出x2的值,继而得出相应的y2 note
//note 直线的参数 note
float a1, b1, c1;
//note 一元二次方程的参数 note
float tempX1,tempX2; //note 最后得出的两个X坐标 note
k = (this.transform.localPosition.y - joyInitY) / (this.transform.localPosition.x - joyInitX);
b = joyInitY - k * joyInitX;
a1 = 1 + k*k;
b1 = 2 * (k*b -k*joyInitY - joyInitX);
c1 = joyInitX*joyInitX + b*b + joyInitY*joyInitY - 2*b*joyInitY - joyMoveDistance*joyMoveD
tempX1 = (-b1 + Mathf.Sqrt(b1*b1 - 4*a1*c1)) / (2 * a1);
tempX2 = (-b1 - Mathf.Sqrt(b1*b1 - 4*a1*c1)) / (2 * a1);
if(this.transform.localPosition.x & joyInitX)
if(tempX1 & joyInitX)
this.transform.localPosition = new Vector3 (tempX1, k*tempX1 + b, 0);
this.transform.localPosition = new Vector3 (tempX2, k*tempX2 + b, 0);
if(tempX1 & joyInitX)
this.transform.localPosition = new Vector3 (tempX1, k*tempX1 + b, 0);
this.transform.localPosition = new Vector3 (tempX2, k*tempX2 + b, 0);
最后呢,总结一下吧,因为接触Unity时间不长,更加不说NGUI了,所以自适应效果没有做,还有一些异常处理液没有做,如果代码里面的某些东西给大家带来误导,那我先抱歉一下哈,哦,对了,最重要的,因为爪机太过落后,没能上真机调试,真能用电脑来调,所以就不是Touch时间了,而是mouse事件,不过应该改一下就行了,思想都是一样的哈,有什么好的意见或者建议请留言或者QQ或者邮箱联系哈。
NGUI版虚拟摇杆joystick
【Unity3d基础】Unity3d中利用NGUI实现虚拟摇杆
Unity中实现摇杆功能
Unity3d 基于NGUI的虚拟摇杆实现
Unity3D关于NGUI和UGUI做简易的虚拟摇杆
【Unity】用NGUI实现摇杆功能
Unity3D NGUI屏幕摇杆
NGUI版虚拟摇杆
没有更多推荐了,基于unity3d的NGUI事件找出当前触发的事件和触发事件的物体
作为一个3d开发者,在面对很多窗体的时候,是否因为找不到当前的窗体或者按钮触发的事件而抓破了头皮,是否因为在Game视图中找不到当前按钮的名字而苦恼。
下面就有我来帮助你们解决吧,方法很简单额并且很实用额。
首先我们都知道NGUI的事件触发都离不开一个EventListener类,根据C#的委托与事件的定义,找到target与Method属性就可以了。
为了能实时监测和显示我们在OnGUI方法中写就可以。我就列出核心的代码吧。
void OnGUI()
(UICamera.hoveredObject != null)
&& & obj =
UICamera.hoveredO
builder.Length = 0;
builder.Append(obj.name);
FindName(obj.transform);
GUI.contentColor = nCoTextC
GUILayout.Label("当前鼠标悬浮物体所在的层级中所有物体的名字" +
builder.ToString());
UIEventListener listener = obj.GetComponent();
(listener != null)
(listener.onClick != null)
&GUILayout.Label("当前点击触发事件为" +
listener.onClick.Target + "\\" +
listener.onClick.Method);
(Input.GetMouseButtonDown(1))
#if UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX ||
UNITY_EDITOR
UnityEditor.EditorGUIUtility.PingObject(obj.GetInstanceID());
以我们的公司"契约"项目为例
当我们把鼠标悬浮到一个注册了UiEventListenerde的onClick事件的时候就会显示出如下&右键点击还可以定位到当前触发事件的按钮上,是不是很棒呢?&
这是我的第一篇文章,又不对的地方还请大神指出校正。&
[转载说明出处额,不然打pp]
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。NGUI怎么用代码模拟控制点击 - Unity3d技术 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSohounity3d NGUI学习(一)
UIAnchor官方demo解析
学习u3d有一段时间了,现在开始接触NGUI,为什么要用NGUI,它跟原生的GUI有什么区别,网上的资料很多,我不在赘述,怎么学习呢,UIAnchor是什么,他跟panel有什么区别等等,学习之前我也不知道,所以我做了他给的所有例子,在博客上记录一下,相信做完之后,你应该全都明白了。我也会写下在制作中遇到的问题和解决的办法,当然还有自己摸索出来的东西,欢迎关注。下载NGUI,安装,这些步骤就不说了,开始吧 !这篇主要是做第一个例子 UIAuthor & &主要是里面的对其功能喝水不忘挖井人:1.删除主摄像机,创建新UI &NGUI-&Create a new UI 使用默认即可2.修改默认的结果,将panel和Anchor位置互调3.为Anchor添加一个空游戏对象,命名为offset,reset它的坐标。改对象用来控制控件与auchor的偏移量。4.下面就要往offset里面添加控件了,我们使用默认的图集和字体集fantasv & 添加一个label,文本改为Bottom5.以同样的方法在offset中添加一个slicedsprite,并调节depth为-1,高度为286.选择Anchor,选择对齐方式(side)为Bottom,选择offset,控制按钮的相对偏移量 7.其他的7个Anchor可以使用Ctrl+D复制出来,并且更改label文本,anchor的对齐方式,offset的偏移量,会有这样的结果8.制作其背景,在panel下面新建一个空的游戏对象,并reset一下。命名为Anchor-background,将对象转化为anchor,原网站说的是:在NGUI菜单中,选择Attach an Anchor,但是我并没有找到这个东西,我的做法是找到UIAnchor.cs并且绑定到该空对象,设定其对齐方式为center,然后再在其下面创建一个空的游戏对象,并且reset一下,命名为window,在window下面创建一个slicedSprite做为背景,调整slicedSprite 的大小,并且将他的Depth设为-2,9.添加文字,在window下面添加一个label,设定其宽度为500,修改其文本总结一下:第一个demo原型差不多出来了,善于使用空对象管理那些零散控件,在加入对象时,先reset一下,养成这样的好习惯,有的时候我们插入的东西大小跟你想象的不大一样,很可能是它的父亲,或者父亲的父亲没有reset,即带有scale值。背景一般会使用slicedSprite ,这是因为sliceSprite里面封装了九宫格算法(不知道可以google 九宫格),slicedSprite 下面的类型,你可以自己试一下,他能做很多东西。二维的ui没有z坐标,所以控制他们图层使用depth ,数值大,在前面.欢迎拍砖,留言!转载注明出处! 谢谢
【上一篇】
【下一篇】
Copyright & 2011 只为五斗米 All rights reserved.社会化媒体
了解更多>>
桂ICP备 号
阅读下一篇
自媒体运营攻略
行业经验交流
Hi,在你登录以后,就可以永久免费的收藏任何您感兴趣的内容,关注感兴趣的作者!
手机注册或邮箱注册
点击按钮进行验证
请输入正确的邮箱
已有帐号请点击
帐号创建成功!
我们刚刚给你发送了一封验证邮件
请在48小时内查收邮件,并按照提示验证邮箱
感谢你对微口网的信任与支持
你输入的邮箱还未注册
还没有帐号请点击
点击按钮进行验证
你输入的邮箱还未注册
又想起来了?
你已成功重置密码,请妥善保管,以后使用新密码登录
邮件发送成功!
我们刚刚给你发送了一封邮件
请在5分钟内查收邮件,并按照提示重置密码
感谢你对微口网的信任与支持
对不起,你的帐号尚未验证
如果你没有收到邮件,请留意垃圾箱 或
意见与建议
请留下您的联系方式
* 留下您正确的联系方式,以便工作人员尽快与你取得联系
转藏至我的藏点}

我要回帖

更多关于 unity3d 5.x ngui 的文章

更多推荐

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

点击添加站长微信