转载请声明: 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 实现自己的双摇杆的更多相关文章

  1. Unity5.5+easytouch5双摇杆控制角色移动

    第一步:新建两个Joystick,分别改名LeftJoyStick和RightJoyStick 在LeftJoyStick的ETC Joystick-Axes properties中的Horizont ...

  2. Unity3D插件之Easy Touch 3.1(1): Easy Joystick

    先看官方介绍:https://www.assetstore.unity3d.com/#/content/3322 (Allows you to quickly and easily develop a ...

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

    转自Unity3D for iOS 这篇文章还可以在这里找到 英语 Learn how to use Unity to make a simple 3D iOS game! 这篇教材是来自教程团队成员 ...

  4. Unity3D 第一人称控制器 C#脚本

    CharacterMotor.cs using UnityEngine; using System.Collections; /** * @Author : www.xuanyusong.com */ ...

  5. unity3d插件Daikon Forge GUI 中文教程1-Daikon Forge介绍

    DF-GUI特点: ·        深编辑器集成:DF-GUI提供广泛的整合与Unity3D编辑环境,包括自定义检查人员对每个组件向导来简化复杂的多步任务,提高生产力的上下文菜单,编辑控件在一个所见 ...

  6. [Unity2D]2D Mobile Joystick

    效果预览 操作步骤 1.下载素材 http://pan.bai du.com/s/1gdkQz8v 2.新建一个GUITexture(Joystick)及一个Sprite(Nyan)   3.添加背景 ...

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

    大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei.今天呢,我们来一起学习在Unity3D中使用EasyTouch虚拟摇杆来控制人物移动.虽然Un ...

  8. 手机3D游戏开发:自定义Joystick的相关设置和脚本源码

    Joystick在手游开发中非常常见,也就是在手机屏幕上的虚拟操纵杆,但是Unity3D自带的Joystick贴图比较原始,所以经常有使用自定义贴图的需求. 下面就来演示一下如何实现自定义JoySti ...

  9. unity3d插件Daikon Forge GUI 中文教程-1-Daikon Forge介绍

    (游戏蛮牛首发)大家好我是孙广东官网提供了专业的视频教程http://www.daikonforge.com/dfgui/tutorials/,只是是在youtube上,要观看是须要FQ的. 只是教程 ...

随机推荐

  1. java中Collection类及其子类

    1:对象数组(掌握) (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组. 2:集合(Collection)(掌握) (1)集合的由来? 我们学习的是Java ...

  2. js导入导出excel

    导入: <html xmlns="http://www.w3.org/1999/xhtml" > <head>      <title>Unti ...

  3. 2014年4月底至5月初51Aspx源码发布详情

    精灵豆会员管理系统源码  2014-4-21 [VS2010]功能介绍:精灵豆会员管理系统业务管理平台采用微软选进的C#语言开发,采用大型数据库,具有比较高的执行效率和高安全性.系统分为消费管理,会员 ...

  4. Python学习路程day1

    变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...

  5. echo、print、sprint、sprintf输出

    echo() 函数 定义和用法 echo() 函数输出一个或多个字符串. 语法 echo(strings) 参数 描述 strings 必需.一个或多个要发送到输出的字符串. 提示和注释 注释:ech ...

  6. Unity3D 使用C#指针unsafe

    Unsafe code requires the `unsafe' command line option to be specified 在Unity开发中,如果涉及到指针的使用,需要自己定义预处理 ...

  7. 最短JS判断是否为IE6(IE的写法)

    常用的 JavaScript 检测浏览器为 IE 是哪个版本的代码,包括是否是最人极端厌恶的 ie6 识别与检测.代码如下: var isIE=!!window.ActiveXObject; var ...

  8. sql 查询效率

    1. SQL优化的原则是:将一次操作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量.调整不良SQL通常可以从以下几点切入: 检查不良的SQL,考虑其写法是否还有可优化内容 检查子查 ...

  9. Android——数据存储(课堂代码整理:SharedPreferences存储和手机内部文件存储)

    layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  10. poj3160 强连通+记忆化搜索

    题意:有一张 n 点 m 边的有向无环图,每个点有各自的权值,可正可负,现在从一个点开始走,一直走到不能走到其他点为止,每经过一个点,可以选择获得或不获得它的权值,每个点可以走多次,但是权值只能获得一 ...