博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机
阅读量:7207 次
发布时间:2019-06-29

本文共 3176 字,大约阅读时间需要 10 分钟。

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

 

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

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

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

 

[csharp] 
 
 
  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] 
 
 
  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

你可能感兴趣的文章
未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包。
查看>>
Web Design - The Viewport
查看>>
程序员学习能力提升三要素
查看>>
何时使用hadoop fs、hadoop dfs与hdfs dfs命令(转)
查看>>
【Coursera】Third Week(1)
查看>>
管道和重定向笔记
查看>>
C++11 并发指南------std::thread 详解
查看>>
windows下编译chromium浏览器的15个流程整理
查看>>
Android监听返回键、Home键+再按一次返回键退出应用
查看>>
p2p穿透技术
查看>>
BZOJ1841 : 蚂蚁搬家
查看>>
html成绩单表格
查看>>
Coding 初级教程(二)——上传已有项目
查看>>
java 基础
查看>>
【Android】Android6.0发送短信Demo
查看>>
《徐徐道来话Java》:PriorityQueue和最小堆
查看>>
微信支付中的刷卡支付和扫码支付测试
查看>>
中国金融出版社出版的2013版《风险管理》
查看>>
BZOJ1055: [HAOI2008]玩具取名[区间DP]
查看>>
【转】iOS 10 UserNotifications 使用说明
查看>>