Unity3D 双摇杆 c# JoyStick 实现自己的双摇杆
转载请声明: http://www.cnblogs.com/ADaii/p/3859520.html
Untiy3D 官方摇杆脚本只能完成一个摇杆,要实现双摇杆比较费劲
现在我吧我废了一通宵的结果共享给大家
1.双摇杆是用来控制第一人称控制器的,但第一人称控制器右js和c#有的地方不能通用,所以首先要将所有将本变为c#脚本
http://www.cnblogs.com/ADaii/p/3859527.html
2.建立Joystick.cs脚本,我也在代码中加了注释方便大家理解
3.将GUI摇杆纹理放入脚本,并将脚本关联与第一人称控制器
4.修改第一人称控制器脚本(见2 连接)
- /**
- * 王天宇 编写于:2014-07-21
- * JoyStick.cs
- */
- using UnityEngine;
- using System.Collections;
- //创建枚举类型,可在加载脚本的实体上选择是左摇杆还是右摇杆
- public enum JoyStickType
- {
- leftJoyStick,
- rightJoyStick
- }
- //脚本JoyStick类
- public class JoyStick : MonoBehaviour
- {
- public JoyStickType joyStickType; //摇杆类型,左摇杆还是右摇杆
- private Vector2 centerPos; //摇杆的中心点位置,屏幕坐标
- public GUITexture centerBall; //球型摇杆
- public float joyStickRadius; //摇杆移动范围的半径
- private Vector2 position; //摇杆要传递出去的参数,就靠他控制移动旋转
- private int lastFingerID = -; //最后一次触摸的手指id
- private bool centerBallMoving = false; //球型摇杆移动开关
- //加载时运行方法
- void Start ()
- {
- //为了让摇杆适配不同分辨率屏幕,设置大小和坐标
- centerBall.transform.localScale = new Vector3( centerBall.pixelInset.size.x / Screen.width, centerBall.pixelInset.size.y / Screen.height,);
- //因为GUI纹理锚点都是左下角0,0 所以为了让两边摇杆对称摇杆坐标向-x方向移动半个纹理宽的屏幕距离(屏幕距离通过 纹理宽:屏幕分辨率宽 获得)
- centerBall.transform.position = new Vector3 (centerBall.transform.position.x - centerBall.pixelInset.size.x//Screen.width,
- centerBall.transform.position.y,);
- //将摇杆坐标赋给作为摇杆的中心,以后用来复位摇杆用
- centerPos = centerBall.transform.position;
- }
- //每帧运行方法
- void Update ()
- {
- //调用摇杆方法
- JoyStickController();
- }
- //摇杆方法
- void JoyStickController()
- {
- int count = Input.touchCount; //获取触摸点的数量
- for (int i = ; i < count; i++) //逐个分析触摸点的操作
- {
- Touch touch = Input.GetTouch(i); //获取当前处理的触摸点
- //将当前的触摸坐标转换为屏幕坐标
- Vector2 currentTouchPos = new Vector2(touch.position.x/Screen.width - centerBall.pixelInset.size.x//Screen.width, touch.position.y/Screen.height);
- Vector2 temp = currentTouchPos - centerPos; //得到方向向量temp(触摸的位置和摇杆的坐标差)
- if (centerBall.HitTest(touch.position)) //判断是否触摸点在要干范围之内
- {
- if (temp.magnitude < joyStickRadius) //如果方向向量temp的长度没有超出摇杆的半径,temp.magnitude为求坐标差的距离,及两点间的距离
- {
- lastFingerID = touch.fingerId; //记录该触摸的id
- centerBallMoving = true; //摇杆移动开关打开
- }
- }
- //若中心球移动开关打开,摇杆中心球就会跟随手指移动。但需要加以限制,当手指触摸没有超出摇杆的圆形区域时,中心球完全跟随手指触摸;
- //当手指触摸超出圆形区域时,中心球处于触摸位置和摇杆中心点所形成的方向上并且不能超出半径
- if (touch.fingerId == lastFingerID && centerBallMoving)
- {
- if (temp.magnitude < joyStickRadius) //如果手指触摸没有超出摇杆的圆形区域,即摇杆半径,摇杆中心球的位置一直跟随手指
- {
- centerBall.transform.position = new Vector3 (currentTouchPos.x,currentTouchPos.y,); //设置摇杆的坐标等于触点的坐标
- }
- else //超出半径
- {
- Vector2 temp2 = temp; //定义临时变量temp2
- temp2.Normalize(); //将temp2标准化
- //设置摇杆坐标位置不超过半径
- centerBall.transform.position = new Vector3((joyStickRadius * temp2 + centerPos).x, (joyStickRadius * temp2 + centerPos).y, );
- }
- if (temp.x >= )
- {
- //一下为示例代码:控制旋转方向,主要利用Vector2.Angle(temp, new Vector2(0, 5))得到角度并利用
- //initialization_script.current_player_tank_script.BodyRotation(Vector2.Angle(temp, new Vector2(0, 5)));
- }
- if (temp.x< )
- {
- //一下为示例代码:控制旋转方向,主要利用Vector2.Angle(temp, new Vector2(0, 5))得到角度并利用
- //initialization_script.current_player_tank_script.BodyRotation(-1 * Vector2.Angle(temp1, new Vector2(0, 5)));
- }
- //控制移动的函数或者控制开火的函数,假设左摇杆控制移动,右摇旋转
- switch(joyStickType)
- {
- case JoyStickType.leftJoyStick:
- position = temp*; //移动需坐标
- break;
- case JoyStickType.rightJoyStick:
- position = temp*; //旋转需坐标
- break;
- }
- //当释放触摸的时候中心球位置重置
- if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)
- {
- centerBall.transform.position = new Vector3(centerPos.x, centerPos.y, ); //摇杆复位
- temp = new Vector2(,); //距离差为0
- position = temp; //赋值0给需要坐标已停止动作
- centerBallMoving = false; //设置不能移动摇杆
- lastFingerID = -; //清楚本次手指触摸id
- }
- }
- }
- }
- //获取传递坐标方法
- public Vector2 getPositions()
- {
- return position;
- }
- }
Unity3D 双摇杆 c# JoyStick 实现自己的双摇杆的更多相关文章
- Unity5.5+easytouch5双摇杆控制角色移动
第一步:新建两个Joystick,分别改名LeftJoyStick和RightJoyStick 在LeftJoyStick的ETC Joystick-Axes properties中的Horizont ...
- Unity3D插件之Easy Touch 3.1(1): Easy Joystick
先看官方介绍:https://www.assetstore.unity3d.com/#/content/3322 (Allows you to quickly and easily develop a ...
- Unity3D for iOS初级教程:Part 2/3
转自Unity3D for iOS 这篇文章还可以在这里找到 英语 Learn how to use Unity to make a simple 3D iOS game! 这篇教材是来自教程团队成员 ...
- Unity3D 第一人称控制器 C#脚本
CharacterMotor.cs using UnityEngine; using System.Collections; /** * @Author : www.xuanyusong.com */ ...
- unity3d插件Daikon Forge GUI 中文教程1-Daikon Forge介绍
DF-GUI特点: · 深编辑器集成:DF-GUI提供广泛的整合与Unity3D编辑环境,包括自定义检查人员对每个组件向导来简化复杂的多步任务,提高生产力的上下文菜单,编辑控件在一个所见 ...
- [Unity2D]2D Mobile Joystick
效果预览 操作步骤 1.下载素材 http://pan.bai du.com/s/1gdkQz8v 2.新建一个GUITexture(Joystick)及一个Sprite(Nyan) 3.添加背景 ...
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei.今天呢,我们来一起学习在Unity3D中使用EasyTouch虚拟摇杆来控制人物移动.虽然Un ...
- 手机3D游戏开发:自定义Joystick的相关设置和脚本源码
Joystick在手游开发中非常常见,也就是在手机屏幕上的虚拟操纵杆,但是Unity3D自带的Joystick贴图比较原始,所以经常有使用自定义贴图的需求. 下面就来演示一下如何实现自定义JoySti ...
- unity3d插件Daikon Forge GUI 中文教程-1-Daikon Forge介绍
(游戏蛮牛首发)大家好我是孙广东官网提供了专业的视频教程http://www.daikonforge.com/dfgui/tutorials/,只是是在youtube上,要观看是须要FQ的. 只是教程 ...
随机推荐
- 基础php链接SQL数据库
要连接到你的数据库必须添加以下几条数据: $conn = @mysql_connect("localhost","root","root") ...
- CTSC&&APIO 2015 酱油记
在北京待了一周多,还是写点记录吧. 人民大学校园还是挺不错的,不过伙食差评. CTSC的题目太神,根本不会搞,一试20二试10分..本来都寄希望于提交答案题的..结果就悲剧了. 然后是听大爷们的论文答 ...
- linux 2.6.21版本的内核合法的MAC地址
当执行ifconfig eth0 hw ether 11:22:33:44:55:66时,当前内核显示修改成功,但是ping时只无限发送ARP包,PC机也已经给板子回ARP包,但没有任何ICMP包的信 ...
- EF 自定义校验设置和捕获异常
一.定义 public class MyItem: IValidatableObject { [Key] public long Id { get; set; } [Range(0, 100, Err ...
- 学习笔记之 prim算法和kruskal算法
~. 最近数据结构课讲到了prim算法,然而一直使用kruskal算法的我还不知prim的思想,实在是寝食难安,于此灯火通明之时写此随笔,以祭奠我睡过去的数 据结构课. 一,最小生成树之prim pr ...
- Bean property '**DAO' is not writable or has an invalid setter method
ApplicationContext.xml中配置有问题,里面的bean的属性名称写错了. ApplicationContext.xml中写的是loginDAO,在java类里配置的bean却写成了l ...
- 循环数据forin,foreach,for of
最近一直在对数据处理,循环匹配之类的,我的mentor也已经多次指出一个问题,就是在循环里面用if去判断一个数值是否存在的时候,只要找到就要退出,这个时候就要对循环的语法提出了要求: 1.for in ...
- js 上传文件预览
1. FILE API html5提供了FIle和FileReader两个方法,可以读取文件信息并读取文件. 2. example <html> <body> <div ...
- RabbitMQ/JAVA (路由选择)
上篇博文中,我们建立了一个简单的日志系统.可以广播消息给多个消费者.本篇博文,我们将添加新的特性--我们可以只订阅部分消息.比如:我们可以接收Error级别的消息写入文件.同时仍然可以在控制台打印所有 ...
- MySQL 数据库实现远程连接
1,刚开始我使用的是Navicat for MySQL工具连接远程的mysql的数据库. 报错了.报错信息是 Error 1130: Host '192.168.1.80' is not allowe ...