unity實現(xiàn)手游虛擬搖桿
更新時間:2020年04月15日 11:19:45 作者:玉骨寒
這篇文章主要為大家詳細介紹了unity實現(xiàn)手游虛擬搖桿,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了unity實現(xiàn)手游虛擬搖桿的具體代碼,供大家參考,具體內(nèi)容如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 綁定到搖桿上的搖桿類,參考半徑50
/// </summary>
public class Rocker : MonoBehaviour {
Vector2 m_offet;//偏移向量
Vector2 m_originalPos;//搖桿原始屏幕坐標(biāo)
Touch[] touches;//屏幕上觸控點數(shù)組
int touch_Id = -1;//觸控點數(shù)組下標(biāo)
bool isMove = false;//是否移動
float m_ScreenScale;
/// <summary>
/// 給外部調(diào)用的偏移向量,告知搖桿參數(shù)
/// </summary>
public Vector3 Offet
{
get
{
return m_offet;
}
}
// Use this for initialization
void Start () {
m_originalPos = transform.position;//搖桿中心的屏幕坐標(biāo)位置
m_ScreenScale = Screen.width / 800f;
}
// Update is called once per frame
void Update () {
//得到屏幕觸控數(shù)組
touches = Input.touches;
if (touches.Length > 0)//如果觸點開啟
{
//得到離搖桿中心最近的觸點下標(biāo) touch_Id;
if (touches.Length == 1)//只有一個觸點時
{
touch_Id = 0;
}
else if (touches.Length > 1)//觸點大于1個時
{
touch_Id = 0;//先假設(shè)下標(biāo)為0
for (int i = 1; i < touches.Length; i++)//遍歷觸點數(shù)組
{
if (Vector2.SqrMagnitude(touches[i].position - m_originalPos) < Vector2.SqrMagnitude(touches[touch_Id].position - m_originalPos))//第i個點比假設(shè)的點近
{
touch_Id = i;//假設(shè)的點改為第i個點
}
}
}
//如果得到的觸點不是取消或抬起
if (Input.GetTouch(touch_Id).phase != TouchPhase.Canceled && Input.GetTouch(touch_Id).phase != TouchPhase.Ended)
{
//觸點在搖桿范圍內(nèi)
if(Vector2.SqrMagnitude(touches[touch_Id].position - m_originalPos) <= 50*50 * m_ScreenScale * m_ScreenScale)//50為背景半徑
{
isMove = true;//開啟遙控
//搖桿開始控制,計算偏移量
SetOffetIn();
}
else if(isMove)//觸點在搖桿范圍外,但是遙控已經(jīng)開啟
{
SetOffetOut();
}
}
else// 手指抬起,搖桿回歸原始位置
{
transform.position = m_originalPos;
m_offet = Vector2.zero;
isMove = false;
touch_Id = -1;
}
}
}
/// <summary>
/// 觸點在操作盤內(nèi)時
/// 搖桿控制方法
/// </summary>
void SetOffetIn()
{
//距離過小視為不偏移搖桿位置不變
if(Vector2.SqrMagnitude(touches[touch_Id].position - m_originalPos) < 5 * m_ScreenScale)
{
GetComponent<Image>().rectTransform.position = m_originalPos;//搖桿定位在原始位置
m_offet = Vector3.zero;
}
else
{
//搖桿位置追蹤
GetComponent<Image>().rectTransform.position = touches[touch_Id].position;
m_offet = touches[touch_Id].position - m_originalPos;//賦值偏移值
m_offet = m_offet.normalized;//歸一化
}
}
/// <summary>
/// 觸點在操作盤外時
/// 搖桿控制方法
/// </summary>
void SetOffetOut()
{
Vector2 tempDir;//臨時偏移向量
tempDir = touches[touch_Id].position - m_originalPos;
//更新?lián)u桿位置:距離原始位置127各單位
GetComponent<Image>().rectTransform.position = m_originalPos + (tempDir.normalized) * 25*m_ScreenScale;
//偏移量
m_offet = tempDir.normalized;//歸一化
}
private void OnGUI()
{
GUIStyle style = new GUIStyle(); //實例化一個新的GUIStyle,名稱為style ,后期使用
style.fontSize = 50; //字體的大小設(shè)置數(shù)值越大,字越大,默認(rèn)顏色為黑色
style.normal.textColor = new Color(1, 1, 1); //設(shè)置文本的顏色為 新的顏色(0,0,0)修改值-代表不同的顏色,值為整數(shù) 我個人覺得有點像RGB的感覺
GUI.Label(new Rect(20, 30, 300, 60), "原始位置:" + m_originalPos.ToString(),style);
GUI.Label(new Rect(20, 100, 300, 60), "搖桿位置:" + GetComponent<Image>().rectTransform.position.ToString(), style);
GUI.Label(new Rect(20, 170, 300, 60), "觸點位置:" + touches[touch_Id].position.ToString(), style);
GUI.Label(new Rect(20, 240, 300, 60), "屏幕分辨率:" + Screen.currentResolution, style);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實現(xiàn)遠程關(guān)閉和重啟計算機的示例代碼
這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)遠程關(guān)閉和重啟計算機的功能,文中的示例代碼講解詳細,對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
利用Aspose.Word控件實現(xiàn)Word文檔的操作
偶然一次機會,一個項目的報表功能指定需要導(dǎo)出為Word文檔,因此尋找了很多篇文章,不過多數(shù)介紹的比較簡單一點,于是也參考了官方的幫助介紹,終于滿足了客戶的需求。下面我由淺入深來介紹這個控件在實際業(yè)務(wù)中的使用過程吧2013-05-05
深入多線程之:Reader與Write Locks(讀寫鎖)的使用詳解
本篇文章是對Reader與Write Locks(讀寫鎖)的使用進行了詳細的分析介紹,需要的朋友參考下2013-05-05

