Unity3D 双摇杆 c# JoyStick 实现自己的双摇杆

欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频U3D教程U3D常见问题U3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内unity3d培训、学习第一品牌。

   Untiy3D 官方摇杆脚本只能完成一个摇杆,要实现双摇杆比较费劲

  现在我吧我废了一通宵的结果共享给大家

  1.双摇杆是用来控制第一人称控制器的,但第一人称控制器右js和c#有的地方不能通用,所以首先要将所有将本变为c#脚本

  http://unity.gopedu.com/thread-9313-1-1.html

  2.建立Joystick.cs脚本,我也在代码中加了注释方便大家理解

  3.将GUI摇杆纹理放入脚本,并将脚本关联与第一人称控制器

  4.修改第一人称控制器脚本

 /**

  * *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 = -1; //最后一次触摸的手指id

  private bool centerBallMoving = false; //球型摇杆移动开关

  //加载时运行方法

  void Start ()

  {

  //为了让摇杆适配不同分辨率屏幕,设置大小和坐标

  centerBall.transform.localScale = new Vector3( centerBall.pixelInset.size.x / Screen.width, centerBall.pixelInset.size.y / Screen.height,0);

  //因为GUI纹理锚点都是左下角0,0 所以为了让两边摇杆对称摇杆坐标向-x方向移动半个纹理宽的屏幕距离(屏幕距离通过 纹理宽:屏幕分辨率宽 获得)

  centerBall.transform.position = new Vector3 (centerBall.transform.position.x - centerBall.pixelInset.size.x/2/Screen.width,

  centerBall.transform.position.y,0);

  //将摇杆坐标赋给作为摇杆的中心,以后用来复位摇杆用

  centerPos = centerBall.transform.position;

  }

  //每帧运行方法

  void Update ()

  {

  //调用摇杆方法

  JoyStickController();

  }

  //摇杆方法

  void JoyStickController()

  {

  int count = Input.touchCount; //获取触摸点的数量

  for (int i = 0; i count; i++) //逐个分析触摸点的操作

  {

  Touch touch = Input.GetTouch(i); //获取当前处理的触摸点

  //将当前的触摸坐标转换为屏幕坐标

  Vector2 currentTouchPos = new Vector2(touch.position.x/Screen.width - centerBall.pixelInset.size.x/2/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,0); //设置摇杆的坐标等于触点的坐标

  }

  else //超出半径

  {

  Vector2 temp2 = temp; //定义临时变量temp2

  temp2.Normalize(); //将temp2标准化

  //设置摇杆坐标位置不超过半径

  centerBall.transform.position = new Vector3((joyStickRadius * temp2 + centerPos).x, (joyStickRadius * temp2 + centerPos).y, 0);

  }

  if (temp.x = 0)

  {

  //一下为示例代码:控制旋转方向,主要利用Vector2.Angle(temp, new Vector2(0, 5))得到角度并利用

  //initialization_script.current_player_tank_script.BodyRotation(Vector2.Angle(temp, new Vector2(0, 5)));

  }

  if (temp.x 0)

  {

  //一下为示例代码:控制旋转方向,主要利用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*100; //移动需坐标

  break;

  case JoyStickType.rightJoyStick:

  position = temp*10; //旋转需坐标

  break;

  }

  //当释放触摸的时候中心球位置重置

  if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)

  {

  centerBall.transform.position = new Vector3(centerPos.x, centerPos.y, 0); //摇杆复位

  temp = new Vector2(0,0); //距离差为0

  position = temp; //赋值0给需要坐标已停止动作

  centerBallMoving = false; //设置不能移动摇杆

  lastFingerID = -1; //清楚本次手指触摸id

  }

  }

  }

  }

  //获取传递坐标方法

  public Vector2 getPositions()

  {

  return position;

  }

  }

 

更多内容,请访问【狗刨学习网】unity极致学院 http://unity.gopedu.com

声明:此篇文档时来自于【狗刨学习网】社区-unity极致学院,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

时间: 2024-09-29 09:29:14

Unity3D 双摇杆 c# JoyStick 实现自己的双摇杆的相关文章

Unity3d 双摇杆 easyTouch

首先创建一个摇杆的实例 我这里修改名称为Move 复制一下  命名为 Rotate 勾选动态显示,这样用户点击后才会显示摇杆(现在摇杆游戏都是动态显示) 设置摇杆的位置(一个在左下,一个在 右下) 点击后如图 在屏幕的左下方点击 角色的移动直接用摇杆来控制玩家的(x ,z) 别忘了设置速度,这样运行下去,玩家就能随着摇杆进行移动 *********************************************************************** 旋转我们用代码来控制 首

iOS Unity3D游戏引擎入门②

欢迎来到Unity3D for iOS系列教程的第二部分!在这个系列的第一部分中,你已经学习了Unity的一些基本技能来构建一个非常简单的项目,并把它部署到iOS设备上.在继续这篇教程之前,你要确认已阅读过第一部分.现在进入第二部分,你要添加一些功能来增强我们的项目,这些功能包括更好的角色移动,和更好的游戏背景.你也会学习如何使用Unity Remote来调试.游戏再次开启! 让我们开始:改变背景 打开你在教程第一部分的Unity项目.如果你还没有准备好,这里是下载的链接: Unity Proj

Unity3D for iOS初级教程:Part 2/3

转自:http://www.cnblogs.com/alongu3d/archive/2013/06/01/3111736.html 这篇教材是来自教程团队成员 Christine Abernathy, 他是Facebook的开发支持团队的工程师.欢迎来到Unity3D for iOS系列教程的第二部分!在这个系列的第一部分中,你已经学习了Unity的一些基本技能来构建一个非常简单的项目,并把它部署到iOS设备上.在继续这篇教程之前,你要确认已阅读过第一部分.现在进入第二部分,你要添加一些功能来

Unity3D技术之本地客户端开发入门

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 本地客户端开发入门 本地客户端 (NaCl) 是 Google 提供的新技术,其允许您在 Web 页面嵌入本地可执行代码,以便您在无需安装插件的情况下部署性能非常强的 web 应用程序.目前,NaCl 仅支持在 Windows.Mac OS X 和 Linux(含可用的 Chrome 操作系统支

[Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动

大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei.今天呢,我们来一起学习在Unity3D中使用EasyTouch虚拟摇杆来控制人物移动.虽然Unity3D内置了一个Joystick组件(事实上就是一个GUITexture和一个Js脚本文件啦),但是博主在实际使用的时候发现这个内置的Joystick存在无法适应屏幕大小的问题,所以博主在这里向大家推荐使用EasyTouch这个插件,通过这个插件.我们能够高速地在应用中集成虚拟摇杆功能,并且能够

纯净的 Unity Touch JoyStick

最近在研究Unity3D,把研究过程中遇到的问题记录下来作为备份,以后再用到相关知识的时候能够借鉴.最近有一个构思,想做一款小型的练手游戏,边做边学Unity3D.因为是3D游戏,由Joystick控制,因此先研究这里.旨在找出一种纯净的写法,方便以后的扩展. 现在的Unity版本是5.3.0,研究了下较火的EasyTouch 4.2.2.总结下来发现现在应用最多的似乎还是EasyTouch v2 或 v3,到了4反倒是代码相互关联,不好提取. 下面这些是用UGUI开发制作的简单JoyStick

(转)[unity3d]easytouch的使用

对于移动平台上的RPG类的游戏,我们常用虚拟摇杆来控制人物角色的行走和一些行为,相信我们对它并不陌生,之前尝试了EasyTouch2.5,发现并没有最新版的3.1好用,2.5版本的对于自适应没有做的很好,而最新版的已经解决了这一问题.当然unity也自带了摇杆Joystick,用起来也简单,但存在不少局限,不会满足普通mmo游戏的需求,比如指定显示区域或者是更改一些素材等等,而这些EasyTouch插件都已经帮你实现,不得不佩服插件的原作者,能做出这么炫酷好用的插件,当然这估计是老外开发的,关于

Unity3D学习(三):利用NGUI实现一个简单的左右摇杆

前言 小游戏Konster在测试的时候有热心玩家反馈左右移动手感不是很好,最主要的问题是:比如手指一旦按在手机屏幕的右方向按钮上,向左滑动到另一个左移按钮上是不会改变玩家移动方向. 具体如下图: 刚开始我按下了→按钮,小怪兽行走到一半的时候我将拇指滑动到了←按钮,但是小怪兽并没有向左移动,然后就继续向右直到撞上尖刺死亡. 原因就是:我写的脚本只监听了按钮的按下和抬起事件.对于拇指在按钮上的滑动没有做响应处理. 所以我决定重写一个JoyStick脚本来控制小怪兽的移动方向. 实现思路 参考了这篇博

unity3d中的Quaternion.LookRotation

android开发范例中的第二个粒子,是摇杆操作游戏,模式类似于“迷你高尔”,僵尸包围类型的设计游戏. 其中让我注意到这个函数的使用非常特别:Quaternion.LookRotation. 游戏针对两个平台做了输入配置. 在pc平台上控制人物移动用正常的上下左右按键控制,然而人物的旋转就变成了鼠标位置. 正常情况我们希望东西能够根据指定目标方向移动其实用lookat这个函数就可以了.但这个地方用的方法原比lookat来的更加省事儿. 看看他是怎么获得这个角度的: 1 2 3 4 5 6 7 8