天天看點

Unity3D NGUI螢幕搖杆

NGUI下增加一個Empty對象,重命名為Joystick。在它本身上加載UIAnchor腳本,設定好它的大小。Joystick的子集中增加倆個新的Empty,命名為Background,Thumb。所有設定如下所示。

Unity3D NGUI螢幕搖杆
Unity3D NGUI螢幕搖杆
Unity3D NGUI螢幕搖杆
Unity3D NGUI螢幕搖杆

Thumb上增加box collier,為後期螢幕射線能夠打在Background的區域。然後加上NGUIJoystick腳本。拖拽Thumb産生OnDrag,如下代碼所示。

void OnDrag (Vector2 delta) {
		if (enabled && gameObject.activeInHierarchy) {//目前對象被啟用且對下在層次視圖中處于激活狀态
			UICamera.currentTouch.clickNotification = UICamera.ClickNotification.BasedOnDelta;//得到UICamera腳本元件中的BasedDelta變量
			
			Ray ray = UICamera.currentCamera.ScreenPointToRay (UICamera.currentTouch.pos);//得到從UI錄影機發出的到觸摸點的一條射線
			float dist = 0f;//定義射線長度變量
			
			if (mPlane.Raycast (ray, out dist)) {//如果射線發生碰撞
				Vector3 currentPos = ray.GetPoint (dist);//得到射線上距離dist遠處的一個點
				Vector3 offset = currentPos - mLastPos;//計算目前位置和上一次位置的偏移量
				mLastPos = currentPos;//指派

				if (offset.x != 0f || offset.y != 0f) {//當偏移量的x或y分量不為零時
					offset = transform.InverseTransformDirection (offset);//對偏移量進行世界坐标系到本地坐标系的轉換
					offset.Scale (scale);//對偏移量進行縮放
					offset = transform.TransformDirection (offset);//對偏移量進行本地坐标系到世界坐标系的轉換
				}
				
				offset.z = 0;//指派
				transform.position += offset;//改變對象位置
				
				float length = transform.localPosition.magnitude;//得到目前對象本地位置向量的模
				 
				if (length > radius) {//當長度大于虛拟搖杆的背景半徑時
					transform.localPosition = Vector3.ClampMagnitude (transform.localPosition, radius);//計算目前對象的本地位置
				}

				position = new Vector2((transform.localPosition.x-center.x)/radius,(transform.localPosition.y-center.y)/radius);//将二維向量轉換成z預設為0的三維向量
			}
		}
	}
           

主要流程如下所示

Unity3D NGUI螢幕搖杆

下面代碼主角控制器調用,得到joystick的位置,計算出移動向量。

if (Input.GetAxis("Horizontal") == 0 && Input.GetAxis("Vertical") == 0)
        {//當不是用鍵盤控制時(在手機螢幕上通過觸控控制時)
            directionVector = new Vector3(joystick.position.x, 0, joystick.position.y);//計算角色通過虛拟操縱杆來控制時的移動方向
        }
        if (directionVector != Vector3.zero)
        {
            float directionLength = directionVector.magnitude;//計算移動方向向量的長度
            directionVector = directionVector / directionLength;//計算機關向量,這兩句相當于directionVector.normalized,但這兩句計算機關向量比向量的規格化更快

            directionLength = Mathf.Min(0.4f, directionLength);//確定向量長度不超過1
            //使向量到達邊界值更敏感,到達中間值時更遲鈍,這樣使得使用操縱杆時更容易控制減速
            directionLength = directionLength * directionLength;
            //計算移動方向向量
            directionVector = directionVector * directionLength;
        }
        directionVector.y = 0;
        m_charCon.Move(m_trans.TransformDirection(directionVector));//計算移動方向
           

源碼下載下傳

http://download.csdn.net/detail/luoyikun/9047769

繼續閱讀