2015-02-15 13:33:16 book_longssl 阅读数 3221


   官方摇杆脚本只能完成一个摇杆,要实现双摇杆比较费劲
  现在我吧我废了一通宵的结果共享给大家
  1.双摇杆是用来控制第一人称控制器的,但第一人称控制器右js和c#有的地方不能通用,所以首先要将所有将本变为c#脚本
 
  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;
  }
  }

 



2016-04-03 14:44:56 nicepainkiller 阅读数 8735

在新版本的 Unity中 有一个叫做  CrossPlatformInputManager 的东西,用过自带摇杆和按钮的朋友们应该都知道哈

应为 源码中的 CrossPlatformInputManager 用起来不是很顺手,他好像是方形的,但是他能很好的和 unity 自带的 Input 组件很好的结合。所以准备拓展他一下。

直接上源码哈


using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;
using UnityStandardAssets.CrossPlatformInput;

public class JoyStick : MonoBehaviour , IPointerDownHandler, IPointerUpHandler, IDragHandler {

	[Header("最大移动距离")]
	public  int      maxMoveDistance    = 100;
	public  string   horizontalAxisName = "Horizontal";
	public  string   verticalAxisName   = "Vertical";
	//摇杆移动位置
	private Vector3  moveToPosition;
	//摇杆初始位置
	private Vector3  stickOriginPosition;
	//摇杆移动距离
	private float    distanceOriginToDrag;
	private  RectTransform TouchAtlas;
	[SerializeField]
	[Header("摇杆位移比例")]
	private Vector2 deltaPosition;
	public  CrossPlatformInputManager.VirtualAxis virtualAxisHorizontal;
	public  CrossPlatformInputManager.VirtualAxis virtualAxisVertical;

	// Use this for initialization
	void Start () {
		
		TouchAtlas = transform.GetComponent<RectTransform> ();
		stickOriginPosition = TouchAtlas.anchoredPosition3D;
		virtualAxisHorizontal = new CrossPlatformInputManager.VirtualAxis ( horizontalAxisName ); 
		virtualAxisVertical   = new CrossPlatformInputManager.VirtualAxis ( verticalAxisName );
		CrossPlatformInputManager.RegisterVirtualAxis ( virtualAxisHorizontal );
		CrossPlatformInputManager.RegisterVirtualAxis ( virtualAxisVertical   );

	}
		
	void Update()
	{
		distanceOriginToDrag = Vector3.Distance (    TouchAtlas.anchoredPosition3D, stickOriginPosition  );
		if (distanceOriginToDrag >= maxMoveDistance) {
			moveToPosition = stickOriginPosition + ( TouchAtlas.anchoredPosition3D - stickOriginPosition ) * maxMoveDistance / distanceOriginToDrag;
			TouchAtlas.anchoredPosition3D = moveToPosition;
		} 
	}

	public void OnDrag (PointerEventData eventData)
	{

		TouchAtlas.anchoredPosition  +=  eventData.delta*2;

		deltaPosition.x = (  TouchAtlas.anchoredPosition3D.x - stickOriginPosition.x )/ maxMoveDistance;
		deltaPosition.y = (  TouchAtlas.anchoredPosition3D.y - stickOriginPosition.y )/ maxMoveDistance;
		UpdateVirtualAxes ( deltaPosition );
	}

	public void OnPointerDown (PointerEventData eventData)
	{
		Debug.Log ("OnPointerDown");
	}

	public void OnPointerUp (PointerEventData eventData)
	{
		Debug.Log ("OnPointerUp");
		UpdateVirtualAxes ( Vector2.zero );
		TouchAtlas.anchoredPosition3D = stickOriginPosition;
	}

	void UpdateVirtualAxes(Vector2 value)
	{
		virtualAxisHorizontal.Update(value.x);
		virtualAxisVertical.Update(value.y);
	}
}

这样用起来就比较爽了哈

2017-08-26 19:42:36 yy763496668 阅读数 1870

设置摇杆的背景图片的锚点如下:
这里写图片描述

设置摇杆的锚点为背景图片的中心点。
并给摇杆绑定脚本如下:

using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
using System;

public class JoyStickController : MonoBehaviour,IDragHandler,IEndDragHandler {
    //最大的拖动距离
    public float maxDragDistance = 50f;
    //虚拟摇杆的方向
    public Vector3 direction;
    //玩家
    public GameObject player;
    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        //屏幕上的y轴分量 当作游戏世界里的z分量
        //设置玩家的朝向
        player.transform.forward = new Vector3(direction.x,0,direction.y);
        int flag = Vector3.Distance(Vector3.zero, this.transform.localPosition) <1f ? 0 : 1;
        player.transform.Translate(Vector3.forward * flag * Time.deltaTime,Space.Self);

    }
    //拖拽中的时候
    public void OnDrag(PointerEventData eventData)
    {
        this.transform.position = Input.mousePosition;
        if (Vector3.Distance(Vector3.zero,this.transform.localPosition) > maxDragDistance)
        {
            direction = this.transform.position - Vector3.zero;
            this.transform.localPosition = direction.normalized * maxDragDistance;
        }
    }
    //拖拽结束的时候
    public void OnEndDrag(PointerEventData eventData)
    {
        this.transform.localPosition = Vector3.zero;
    }
}

这里写图片描述

2017-04-20 22:37:48 qq_33747722 阅读数 5591

本文介绍使用EasyTouch插件的创建一个虚拟摇杆来控制任务的移动

这个Demo源码包括EasyTouch插件我已经上传了,大家可以下载下来学习玩玩!!!点击打开链接

Easytouch插件下载链接点击打开链接

添加EasyTouch插件

首先把EasyTouch插件拖到unity空项目中

在目录栏中中多了一个Tools选项按钮

按如下图选择,在视图中便出多个虚拟按钮

在Hierarchy面板中多了几个对象

在这里我们只要了解Joystick的属性即可

Joystick属性介绍

在这里注意下Interaction type这个属性,需要添加Event,否则无法与委托事件交互

委托事件的介绍

打开Easy Joystick脚本

在代码中我们会看到定义了一些委托事件

只要我们在自己的代码中添加事件函数

当虚拟摇杆相应事件被触发时,会调用我们写的事件函数

编写代码

在角色上挂载一个C#脚本

using UnityEngine;
using System.Collections;

public class PlayByJoyStick : MonoBehaviour 
{
    public EasyJoystick joystick;//虚拟摇杆
    private float runSpeed=2.0f;
    private Animation anima;

    void Start()
    {
        anima=this.GetComponent<Animation>();
    }

    void OnEnable()
    {
        //注册事件
        EasyJoystick.On_JoystickMoveStart += JoystickMoveStart;
        EasyJoystick.On_JoystickMove += JoystickHandlerMoving;
        EasyJoystick.On_JoystickMoveEnd += JoysticHanderMoveEnd;
    }

    void OnDisable()
    {
        //撤销事件
        EasyJoystick.On_JoystickMoveStart -= JoystickMoveStart;
        EasyJoystick.On_JoystickMove -= JoystickHandlerMoving;
        EasyJoystick.On_JoystickMoveEnd -= JoysticHanderMoveEnd;
    }

    void JoystickMoveStart(MovingJoystick move)
    {
        Debug.Log("主角开始移动");
    }

    void JoystickHandlerMoving(MovingJoystick move)
    {
        if (move.joystick.name != "Joystick")
        {
            return;
        }

        //获取虚拟摇杆偏移量
        float Axis_x = move.joystickAxis.x;
        float Axis_y = move.joystickAxis.y;

        Vector3 position = this.transform.position;
        //设置角色的面向位置
        this.transform.LookAt(new Vector3(position.x-Axis_x,position.y,position.z-Axis_y));

        //切换角色动画
        anima.CrossFade("crouchRun");

        //主角移动
        this.transform.Translate(Vector3.forward*Time.deltaTime*runSpeed);
    }

    void JoysticHanderMoveEnd(MovingJoystick move)
    {
        anima.CrossFade("idleSword");
    }


}


将虚拟摇杆拖进属性面板里

 

 

 

2018-11-27 16:32:36 qq_37080133 阅读数 45
链接:https://pan.baidu.com/s/1KjAuOZsKTP-v73-bM4AFeg 
提取码:odiw 

 这是我写的一个插件,

效果如下:

 源码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TouchManager : MonoBehaviour {

    public GameObject TouchItem;
    public Vector3 dir;
    public bool touchMove;

    public static TouchManager Instance;

    void Awake()
    {
        Instance = this;
    
    }

    
	void Update () {


        if (Input.GetMouseButtonDown(0))
        {

            if (Input.mousePosition.x < 200 && Input.mousePosition.y<200)
            touchMove = true;
            Debug.Log(Input.mousePosition);
            
            
        }


        if (Input.GetMouseButtonUp(0))
        {
            touchMove = false;
            dir = new Vector3();
            TouchItem.transform.localPosition = new Vector3();
        }

        if (touchMove == true)
        {
            

            TouchItem.GetComponent<RectTransform>().position = Input.mousePosition;
            dir = Vector3.Normalize(new Vector3(TouchItem.transform.localPosition.x, 0, TouchItem.transform.localPosition.y));
        
        }


       
	}

}

测试:

 

手游 摇杆

博文 来自: yanggenye
没有更多推荐了,返回首页