前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity3D NGUI屏幕摇杆

Unity3D NGUI屏幕摇杆

作者头像
立羽
发布2023-08-24 13:10:29
1970
发布2023-08-24 13:10:29
举报
文章被收录于专栏:Unity3d程序开发

NGUI下增加一个Empty对象,重命名为Joystick。在它本身上加载UIAnchor脚本,设置好它的大小。Joystick的子集中增加俩个新的Empty,命名为Background,Thumb。所有设置如下所示。

Thumb上增加box collier,为后期屏幕射线能够打在Background的区域。然后加上NGUIJoystick脚本。拖拽Thumb产生OnDrag,如下代码所示。

代码语言:javascript
复制
void OnDrag (Vector2 delta) {
		if (enabled && gameObject.activeInHierarchy) {//当前对象被启用且对下在层次视图中处于激活状态
			UICamera.currentTouch.clickNotification = UICamera.ClickNotification.BasedOnDelta;//得到UICamera脚本组件中的BasedDelta变量
			
			Ray ray = UICamera.currentCamera.ScreenPointToRay (UICamera.currentTouch.pos);//得到从UI摄像机发出的到触摸点的一条射线
			float dist = 0f;//定义射线长度变量
			
			if (mPlane.Raycast (ray, out dist)) {//如果射线发生碰撞
				Vector3 currentPos = ray.GetPoint (dist);//得到射线上距离dist远处的一个点
				Vector3 offset = currentPos - mLastPos;//计算当前位置和上一次位置的偏移量
				mLastPos = currentPos;//赋值

				if (offset.x != 0f || offset.y != 0f) {//当偏移量的x或y分量不为零时
					offset = transform.InverseTransformDirection (offset);//对偏移量进行世界坐标系到本地坐标系的转换
					offset.Scale (scale);//对偏移量进行缩放
					offset = transform.TransformDirection (offset);//对偏移量进行本地坐标系到世界坐标系的转换
				}
				
				offset.z = 0;//赋值
				transform.position += offset;//改变对象位置
				
				float length = transform.localPosition.magnitude;//得到当前对象本地位置向量的模
				 
				if (length > radius) {//当长度大于虚拟摇杆的背景半径时
					transform.localPosition = Vector3.ClampMagnitude (transform.localPosition, radius);//计算当前对象的本地位置
				}

				position = new Vector2((transform.localPosition.x-center.x)/radius,(transform.localPosition.y-center.y)/radius);//将二维向量转换成z默认为0的三维向量
			}
		}
	}

主要流程如下所示

下面代码主角控制器调用,得到joystick的位置,计算出移动向量。

代码语言:javascript
复制
if (Input.GetAxis("Horizontal") == 0 && Input.GetAxis("Vertical") == 0)
        {//当不是用键盘控制时(在手机屏幕上通过触控控制时)
            directionVector = new Vector3(joystick.position.x, 0, joystick.position.y);//计算角色通过虚拟操纵杆来控制时的移动方向
        }
        if (directionVector != Vector3.zero)
        {
            float directionLength = directionVector.magnitude;//计算移动方向向量的长度
            directionVector = directionVector / directionLength;//计算单位向量,这两句相当于directionVector.normalized,但这两句计算单位向量比向量的规格化更快

            directionLength = Mathf.Min(0.4f, directionLength);//确保向量长度不超过1
            //使向量到达边界值更敏感,到达中间值时更迟钝,这样使得使用操纵杆时更容易控制减速
            directionLength = directionLength * directionLength;
            //计算移动方向向量
            directionVector = directionVector * directionLength;
        }
        directionVector.y = 0;
        m_charCon.Move(m_trans.TransformDirection(directionVector));//计算移动方向

源码下载

http://download.csdn.net/detail/luoyikun/9047769

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档