unity實(shí)現(xiàn)手游虛擬搖桿
本文實(shí)例為大家分享了unity實(shí)現(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;//屏幕上觸控點(diǎn)數(shù)組
int touch_Id = -1;//觸控點(diǎn)數(shù)組下標(biāo)
bool isMove = false;//是否移動(dòng)
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 () {
//得到屏幕觸控?cái)?shù)組
touches = Input.touches;
if (touches.Length > 0)//如果觸點(diǎn)開(kāi)啟
{
//得到離搖桿中心最近的觸點(diǎn)下標(biāo) touch_Id;
if (touches.Length == 1)//只有一個(gè)觸點(diǎn)時(shí)
{
touch_Id = 0;
}
else if (touches.Length > 1)//觸點(diǎn)大于1個(gè)時(shí)
{
touch_Id = 0;//先假設(shè)下標(biāo)為0
for (int i = 1; i < touches.Length; i++)//遍歷觸點(diǎn)數(shù)組
{
if (Vector2.SqrMagnitude(touches[i].position - m_originalPos) < Vector2.SqrMagnitude(touches[touch_Id].position - m_originalPos))//第i個(gè)點(diǎn)比假設(shè)的點(diǎn)近
{
touch_Id = i;//假設(shè)的點(diǎn)改為第i個(gè)點(diǎn)
}
}
}
//如果得到的觸點(diǎn)不是取消或抬起
if (Input.GetTouch(touch_Id).phase != TouchPhase.Canceled && Input.GetTouch(touch_Id).phase != TouchPhase.Ended)
{
//觸點(diǎn)在搖桿范圍內(nèi)
if(Vector2.SqrMagnitude(touches[touch_Id].position - m_originalPos) <= 50*50 * m_ScreenScale * m_ScreenScale)//50為背景半徑
{
isMove = true;//開(kāi)啟遙控
//搖桿開(kāi)始控制,計(jì)算偏移量
SetOffetIn();
}
else if(isMove)//觸點(diǎn)在搖桿范圍外,但是遙控已經(jīng)開(kāi)啟
{
SetOffetOut();
}
}
else// 手指抬起,搖桿回歸原始位置
{
transform.position = m_originalPos;
m_offet = Vector2.zero;
isMove = false;
touch_Id = -1;
}
}
}
/// <summary>
/// 觸點(diǎn)在操作盤內(nèi)時(shí)
/// 搖桿控制方法
/// </summary>
void SetOffetIn()
{
//距離過(guò)小視為不偏移搖桿位置不變
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>
/// 觸點(diǎn)在操作盤外時(shí)
/// 搖桿控制方法
/// </summary>
void SetOffetOut()
{
Vector2 tempDir;//臨時(shí)偏移向量
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(); //實(shí)例化一個(gè)新的GUIStyle,名稱為style ,后期使用
style.fontSize = 50; //字體的大小設(shè)置數(shù)值越大,字越大,默認(rèn)顏色為黑色
style.normal.textColor = new Color(1, 1, 1); //設(shè)置文本的顏色為 新的顏色(0,0,0)修改值-代表不同的顏色,值為整數(shù) 我個(gè)人覺(jué)得有點(diǎn)像RGB的感覺(jué)
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), "觸點(diǎn)位置:" + touches[touch_Id].position.ToString(), style);
GUI.Label(new Rect(20, 240, 300, 60), "屏幕分辨率:" + Screen.currentResolution, style);
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- unity實(shí)現(xiàn)手機(jī)端搖桿控制人物移動(dòng)
- Unity實(shí)現(xiàn)簡(jiǎn)單的虛擬搖桿
- unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick
- Unity UGUI通過(guò)搖桿控制角色移動(dòng)
- Unity虛擬搖桿的實(shí)現(xiàn)方法
- Unity3D基于UGUI實(shí)現(xiàn)虛擬搖桿
- Unity3D使用UGUI開(kāi)發(fā)原生虛擬搖桿
- Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿
- Unity使用ScrollRect制作搖桿
- Unity實(shí)現(xiàn)簡(jiǎn)單搖桿的制作
相關(guān)文章
基于C#實(shí)現(xiàn)簡(jiǎn)單的二維碼和條形碼的生成工具
這篇文章主要為大家詳細(xì)介紹了如何基于C#實(shí)現(xiàn)簡(jiǎn)單的二維碼和條形碼工具,用于二維碼條形碼的生成與識(shí)別,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉和重啟計(jì)算機(jī)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉和重啟計(jì)算機(jī)的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
Unity3D移動(dòng)端實(shí)現(xiàn)搖一搖功能
這篇文章主要為大家詳細(xì)介紹了基于Unity3D移動(dòng)端實(shí)現(xiàn)搖一搖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
利用Aspose.Word控件實(shí)現(xiàn)Word文檔的操作
偶然一次機(jī)會(huì),一個(gè)項(xiàng)目的報(bào)表功能指定需要導(dǎo)出為Word文檔,因此尋找了很多篇文章,不過(guò)多數(shù)介紹的比較簡(jiǎn)單一點(diǎn),于是也參考了官方的幫助介紹,終于滿足了客戶的需求。下面我由淺入深來(lái)介紹這個(gè)控件在實(shí)際業(yè)務(wù)中的使用過(guò)程吧2013-05-05
深入多線程之:Reader與Write Locks(讀寫鎖)的使用詳解
本篇文章是對(duì)Reader與Write Locks(讀寫鎖)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#使用AutoMapper進(jìn)行對(duì)象映射的示例代碼
AutoMapper 是一個(gè)對(duì)象到對(duì)象映射的庫(kù),可以簡(jiǎn)化 DTO (Data Transfer Objects) 和實(shí)體類之間的轉(zhuǎn)換,在大型應(yīng)用程序中,通常需要將業(yè)務(wù)實(shí)體映射到視圖模型或 DTO 中,本文將詳細(xì)介紹如何在 C# 項(xiàng)目中使用 AutoMapper,包括安裝、配置、以及示例代碼2024-08-08
C#通過(guò)html調(diào)用WinForm的方法
這篇文章主要介紹了C#通過(guò)html調(diào)用WinForm的方法,涉及html頁(yè)面中使用JavaScript訪問(wèn)C#的相關(guān)技巧,需要的朋友可以參考下2016-04-04
C#實(shí)現(xiàn)六大設(shè)計(jì)原則之接口隔離原則
這篇文章介紹了C#實(shí)現(xiàn)六大設(shè)計(jì)原則之接口隔離原則的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02

