1. 程式人生 > >Unity3d虛擬搖桿控制物體移動及旋轉

Unity3d虛擬搖桿控制物體移動及旋轉

   王者榮耀在現在看來可能已經成為不少人每天都會開啟一款軟體,角色的控制及其操作方式簡單,使其短時間內獲得了大量的玩家喜愛和追捧。

    可以很明顯的看到王者榮耀的操作方式就是虛擬搖桿,可以控制人物的的移動,及其旋轉,或者是控制技能的釋放方向。此篇部落格就unity中如何實現利用UI(虛擬搖桿)控制物體的移動和旋轉。羅馬的路很多,這裡只是其中一條,還望多提出問題,共同學習。

首先,建立一個場景

物體如下: (建立一個炮嘴,方便觀察)


接著是建立UI,網上素材有很多,隨便就可以搜出來好看的圖片

圖片:

層級面板:


簡單操作後,進入到程式碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;


public class JoyStick : MonoBehaviour {
    //搖桿
    private GameObject center;
    //搖桿位置限制
    public float PositionRange;
    //得到物體
    private GameObject cube;
    //移動速度
    public float  MoveSpeed;
    //平滑度
    public float smoothing;
	// Use this for initialization
	void Start () {
        //拿到搖桿
        center = transform.Find("Center").gameObject;
        cube = GameObject.Find("Cube");
        //繫結事件
        UIEventTrigger.Get(center).onPointerDown = MoveByPC;//※
    }
    private void MoveByPC(PointerEventData data)
    {
        StartCoroutine("MovePC");
    }
    IEnumerator MovePC()    
    {
        while (Input.GetMouseButton(0))
        {
            // center.transform.position = Input.mousePosition;初級版搖桿移動
            //拿到滑鼠的座標
            Vector3 MousePos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,0);//平面座標,只需要得到X,Y
            //偏移量的計算  = 滑鼠-  大圓盤
            Vector3 offset = MousePos - this.transform.position;
            //限制移動範圍
            if (offset.magnitude>PositionRange)//※
            {
                //新的偏移量 = 規定範圍  *  偏移量的方向  
                offset = PositionRange * offset.normalized;//偏移量的單位化(得到方向)
            }
            //搖桿的移動= 初始位置   +   偏移量
            center.transform.position = this.transform.position + offset;
            //移動賦給玩家
                //求得移動方向
                Vector3 dir = new Vector3(offset.x,0,offset.y);
                cube.transform.Translate(dir.normalized*Time.deltaTime*MoveSpeed,Space.World);
            //旋轉賦給物體
            Quaternion qua = Quaternion.LookRotation(dir.normalized);//※  將Vector3型別轉換四元數型別
            cube.transform.rotation = Quaternion.Lerp(cube.transform.rotation, qua, Time.deltaTime * smoothing);//四元數的插值,實現平滑過渡
            yield return null;
        }
        //滑鼠鬆開,搖桿位置復位(初始化)
        center.transform.localPosition = Vector3.zero;
    }
	// Update is called once per frame
	void Update () {
		
	}
}

引用指令碼UIEventTrigger,關於該指令碼的使用和說明詳見點選開啟連結。簡單解釋幾句,在UI物體上的不同的操作方式,比如點選,雙擊,拖拽扥操作,可以執行其對應的監聽事件。在虛擬搖桿中用到的是onPointDown(注意大小寫,方法不同),當滑鼠點選時執行的監聽事件。UIEventTrigger熟悉後,會改善我們的開發的效率。

還使用到了協程,協程的定義和使用詳見點選開啟連結

現在開始理一下邏輯:我們操作模擬搖桿 當手指按下拖拽移動時,小圓盤式跟隨著我們的手指的,當手指離開螢幕,小圓盤迴到初始位置,即大圓盤的位置。先實現這一步:

使用到了UIEventTrigger中的onPointerDown監聽事件,當滑鼠即手指按下時 觸發監聽事件,開始協程

協程內:滑鼠為按下狀態時進入迴圈,講滑鼠位置轉換為世界座標(或者將搖桿轉換為螢幕座標計算也可以),和大圓盤的位置相減得到變化向量。控制變化量的大小,控制在合適範圍內。

offset.magnitude是Vector3 的一個方法,將向量轉換為長度,這裡使用方便判斷。

如果超出範圍,變化量應等於最大的範圍。

將變化量賦值給搖桿,註釋解釋的很清楚了。

控制搖桿的位置之後,需要把變化量的方向賦給我們的物體,為什麼是方向呢,因為我們只需要他的方向,在此之前,應該看一下物體是在哪個平面移動,比如說由x,z軸組合的平面內移動,則需要把變化量轉換成這個平面內的向量,因為,我們的向量是x,y軸組成的平面內的向量,需要轉換一下。

然後就是簡單的移動程式碼,需要注意的是方向的向量需要單位化,原因是1*任何數=任何數,方法是 “向量.normalized”。

然後賦值旋轉 此處用到了四元數的一個方法Quternion.LookRotation,具體瞭解點選開啟連結,可以理解為把三維座標(方向)轉換成四元數,在賦值給這個物體的旋轉,四元數不必過多糾結。因為不好理解。。。

Quternion.Lerp為線性差值,在很多地方都有這個方法,詳見點選開啟連結

當滑鼠擡起,即退出while迴圈時,讓搖桿復位。

旋轉可以寫一個新腳本里面用另一個搖桿控制。

好了,到此這篇部落格就結束了,其實對小白和新手並不友好。但是路會越走越寬,終有一天會學到,理解到。

相關推薦

Unity3d虛擬控制物體移動旋轉

   王者榮耀在現在看來可能已經成為不少人每天都會開啟一款軟體,角色的控制及其操作方式簡單,使其短時間內獲得了大量的玩家喜愛和追捧。    可以很明顯的看到王者榮耀的操作方式就是虛擬搖桿,可以控制人物的的移動,及其旋轉,或者是控制技能的釋放方向。此篇部落格就unity中如何實

Unity3D控制物體移動圖片

Unity3D搖桿控制物體移動 指令碼掛在移動的控制器上 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;

Cocos2d-x 3.10 版本的模擬控制精靈移動

VS2017下測試沒有問題,網上程式碼大多有瑕疵什麼的,這個經過我一定的修改。 Joystick.cpp #include "Joystick.h" using namespace cocos2d; //定義一個計時器,隨時檢測滑鼠點選的位置 void HRocker::updat

unity3d 虛擬 ugui

網上找了好多都嫌麻煩,谷歌了一下,完美解決。 需要先建立 Canvas,如下: 程式碼拖拽到 backImage裡: JoyStick.cs using System.Collections; using System.Collec

Unity ——UGUI 通過控制角色移動

  測試結束後,大家就會對這些介面方法有一些初步的瞭解。using UnityEngine; using UnityEngine.EventSystems; // UGUI提供了一些用來操作控制元件的一些方法, 這些方法是以回撥的形式提供的 // 通過介面回撥來實現的 /* * IPointerEnter

Unity3d 控制角色移動 鍵盤按鍵與虛擬

先上角色移動指令碼 using UnityEngine; using System.Collections; public class PlayerMove:MonoBehaviour

Unity 實現手遊裡面滑輪控制移動

很多手遊裡面都有一個滑輪控制人物移動 我前段時間也研究了一下 下面附上原始碼,因為有註釋我就不多說什麼了 原始碼: public class CoronaScripts : MonoBehaviour {  

Unity3D控制物體移動

在遊戲開發中,遊戲物體的移動是最基本的,如果連物體都移動不起來,那就不用說玩遊戲了。 下面記錄了自己在開發中實現的物體移動,不同專案可能有不同的物體移動實現,也有很多種不同的物體移動實現,文章會持續更新。 1.rigidbody.MovePosition()控制物體上下左

[Unity3D]簡單的UGUI滑條控制物體移動

滑條控制物體移動 在做作業的時候需要用滑條控制物體的直線滑動,簡單寫了一下,在這裡分享一下 1、效果 2、用法 建立一個canvas 在canvas上建立一個slider,命名為Mslider 給Mslider加上MySlider指令碼 將目標物體

Unity3d 基於NGUI的虛擬實現

實現效果預覽 C#程式碼 實現: 使用NGUI新增虛擬搖桿背景和其子物體按鈕,為按鈕Attach boxcollider和ButtionScript。為按鈕新增如下指令碼: 注意:其中的靜態屬性可以在控制物體移動的程式碼中訪問用於控制。

Unity3d使用UGUI開發原生虛擬

在Unity3d中開發虛擬搖桿方式有比較多,可以使用EasyTouch、FairyGUI等外掛來開發。本文給大家介紹使用Unity3d的原生UGUI來開發出自己的虛擬搖桿,這樣可以減少遊戲資源包的大小。先展示下效果圖:現在開發我們的開發建立一個Image1,並且在Image1

Unity3D物體移動Player移動的通用方法

物體移動的常用方法一、transform.Translatetransform.Translate(Vector3.forward *MoveSpeed * Time.deltaTime, Space.transform); 二、velocity(剛體)gameObject

Unity3D中開發2D遊戲——簡單控制物體移動

在Unity3D中開發2D遊戲簡單實現物體的上下左右移動1.簡單實現物體的上下左右移動(左前右前)掛到物體下(本人學習過程中所記筆記 給像我一樣的新人提供方便)2.如何正確顯示物體移動時方向定義public精靈陣列tankSprite[]實現按下方向鍵同時顯示物體的正確方向

Unity3D學習筆記(二十三):事件接口、虛擬、層級管理和背包系統

ram veh ces 跟隨鼠標 style 組件 屏幕 向上 grid 事件接口 IDragHandler(常用):鼠標按下拖動時執行(只要鼠標在拖動就一直執行) IDropHandler:對象拖動結束時,如果鼠標在物體的範圍內,執行一次(依賴於IDragHandler存

QT 模仿Android遊戲中虛擬(3)讓圓隨著角度移動

接著上一篇講起,我們需要在滑鼠離開圓的範圍的時候,讓圓跟著滑鼠與圓心的角度移動,那麼我們來看看我們的已知量是什麼: 1、圓心座標 2、圓的半徑 3、當前滑鼠的座標 運用一下我們的中學知識,根據(1、3

cocos2D 虛擬Joystick功能實現

皮膚 @implementation InputLayer - (id)init { if(self = [super init]) { winSize = [[CCDirector sharedDirector] winSize];

虛擬的修改

poi 如果 [1] 運行時 inpu tex div 這樣的 通過 上次的代碼運行時會有bug:報錯 ArgumentException: Index out of bounds. 即Input.GetTouch()函數進行了越界訪問。於是上網看了看,發現Touc

Unity —— 通過鼠標點擊控制物體移動

技術 aps this lap sep CA sha pub mon 1 //ClickMove - - 通過鼠標點擊控制物體移動 2 3 using System.Collections; 4 using System.Collections.Generic

Easy Touch 控制人物移動

form != iou 導入 方法 har clas 觸摸 delta Easy Touch 搖感控制人物移動 public class joystick : MonoBehaviour { public float Speed;

WASD鍵控制物體移動

指令碼掛在物體上 using System.Collections; using System.Collections.Generic; using UnityEngine; public class write : MonoBehaviour { private Transfo