【转】Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机

http://blog.csdn.net/begonia__z/article/details/51178907

 

前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控制器,主要看看UGUI虚拟摇杆是否可以完美的控制移动和旋转。(PS:主要是为接下来的项目做技术测试),手游版的CF的角色控制器也是利用设个方式进行摄像机的控制,利用双摇杆进行角色的前进和旋转,如果你玩过PSV或者是用过手柄控制器就知道啥意思了,接下来我们就来实现这个功能需求。

首先我们先做两个简单的虚拟摇杆,如下图所示:

因为我们是要实现摄像机的移动,因此我就直接在MainCamera上添加脚本,手游CF左边虚拟摇杆是用来控制角色移动,右边是控制角色的射击以及角色的旋转,那么我们现在我们来实现个功能。因为功能是否简单所以我就直接上代码了。代码如下所示:

 

[csharp]  view plain  copy
 
  1. using System;  
  2. using UnityEngine;  
  3. using System.Collections;  
  4.   
  5. public class ControlCamera : MonoBehaviour  
  6. {  
  7.   
  8.     public float moveSpeed = 100.0f;  
  9.     public float rotateSpeed = 1;  
  10.     public float minAngleY = -30f;  
  11.     public float maxAngleY = 30f;  
  12.     public ScrollCircle joyStick1;  
  13.     public ScrollCircle joyStick2;  
  14.     private Vector2 angleVector2 = Vector2.zero;  
  15.     // Update is called once per frame  
  16.     void Update ()  
  17.     {  
  18.         UpdateCamera();  
  19.     }  
  20.     /// <summary>  
  21.     /// 更新摄像机位置以及旋转角度  
  22.     /// </summary>  
  23.     public void UpdateCamera()  
  24.     {  
  25.         if (!joyStick1.GetIsOnEndDrag() && joyStick1.GetOffsetVector3() != Vector3.zero)  
  26.         {  
  27.   
  28.             this.transform.localPosition = new Vector3(  
  29.                 this.transform.localPosition.x + (joyStick1.GetOffsetVector3().x*moveSpeed),  
  30.                 this.transform.localPosition.y,  
  31.                 this.transform.localPosition.z + (joyStick1.GetOffsetVector3().y*moveSpeed));  
  32.         }  
  33.   
  34.         if (!joyStick2.GetIsOnEndDrag() & joyStick2.GetOffsetVector3() != Vector3.zero)  
  35.         {  
  36.             angleVector2.x += joyStick2.GetOffsetVector3().x*rotateSpeed;  
  37.             angleVector2.y -= joyStick2.GetOffsetVector3().y*rotateSpeed;  
  38.   
  39.             angleVector2.y = ClampAngle(angleVector2.y, minAngleY, maxAngleY);  
  40.   
  41.             Quaternion rotateAngle = Quaternion.Euler(angleVector2.y, angleVector2.x, 0);  
  42.             this.transform.localRotation = rotateAngle;  
  43.             angleVector2.y = ClampAngle(angleVector2.y, minAngleY, maxAngleY);  
  44.         }  
  45.     }  
  46.   
  47.     /// <summary>  
  48.     /// 限制选择角度  
  49.     /// </summary>  
  50.     /// <param name="angle"></param>  
  51.     /// <param name="min"></param>  
  52.     /// <param name="max"></param>  
  53.     /// <returns></returns>  
  54.     static float ClampAngle(float angle, float min, float max)  
  55.     {  
  56.         if (angle < -360)  
  57.             angle += 360;  
  58.         if (angle > 360)  
  59.             angle -= 360;  
  60.         return Mathf.Clamp(angle, min, max);  
  61.     }  
  62. }  

因为代码很简单所以我只是备注了一下函数用法,如果有不懂可以私聊我。

 

代码可能写的不好,欢迎大神们指导教育0.0

2016/4/18 15:46

刚刚发现有仔细看代码的时候发现一个严重bug,Y轴旋转180度后你会发现所有的移动都反了,这样影响到了操作了因此我们需要把这个严重的bug修复了,这里我只把UpdateCamera函数放出来,修改如下:

 

[csharp]  view plain  copy
 
  1. public void UpdateCamera()  
  2.    {  
  3.        if (!joyStick1.GetIsOnEndDrag() && joyStick1.GetOffsetVector3() != Vector3.zero)  
  4.        {  
  5.            movePos.x = joyStick1.GetOffsetVector3().x*moveSpeed;  
  6.            movePos.z = joyStick1.GetOffsetVector3().y*moveSpeed;  
  7.            float y = transform.localRotation.eulerAngles.y;  
  8.            movePos = Quaternion.Euler(0, y, 0)*movePos;  
  9.            Vector3 currentPoint = new Vector3(transform.localPosition.x + movePos.x, transform.localPosition.y,  
  10.                transform.localPosition.z + movePos.z);  
  11.   
  12.            this.transform.localPosition = currentPoint;  
  13.        }  
  14.   
  15.        if (!joyStick2.GetIsOnEndDrag() & joyStick2.GetOffsetVector3() != Vector3.zero)  
  16.        {  
  17.            angleVector2.x += joyStick2.GetOffsetVector3().x*rotateSpeed;  
  18.            angleVector2.y -= joyStick2.GetOffsetVector3().y*rotateSpeed;  
  19.   
  20.            angleVector2.y = ClampAngle(angleVector2.y, minAngleY, maxAngleY);  
  21.   
  22.            Quaternion rotateAngle = Quaternion.Euler(angleVector2.y, angleVector2.x, 0);  
  23.            this.transform.localRotation = rotateAngle;  
  24.            angleVector2.y = ClampAngle(angleVector2.y, minAngleY, maxAngleY);  
  25.        }  
  26.    }  

转载于:https://www.cnblogs.com/mimime/p/6533269.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值