2018年5月2日 星期三

【Unity】非固定式虛擬方向鍵製作Part.2

上一篇中我們完成了滑鼠按下及拖曳時的回饋圖示,接下來要把拖曳中滑鼠位置的數值,帶入角色圖中完成移動的效果。

首先我們直覺一點來考慮移動這件事,目前我們已經有了開始位置startPos和當前位置nowPos,那只要把這兩點距離算出來,就有一個數值可以作為移動量值。
開啟Controller腳本,在dragState = true;後加入以下程式碼:
float dis = Vector2.Distance(nowPos, startPos);
Vector2 dir = (nowPos - startPos).normalized;
actor.Translate(new Vector2(dis * dir.x, dis * dir.y) * speed);
Debug.Log(new Vector2(dis * dir.x, dis * dir.y) * speed);
float變數dis為nowPos到startPos的距離,接著用兩點距離的normalized數值作為方向並帶入變數dir,最後將 dis * dir * speed的數值帶入actor.Translate就完成目前的移動,可以用Debug.Log看看目前移動的數值。(這裡的speed是一個全域float變數,數值0.1f)

編譯後可以執行看看結果,應該會像這樣稍微移動一下就跑超遠:
當然我們可以透過調整speed來解決這個問題,但這裡要注意另一件事,目前我們使用的移動數值,是startPos到nowPos的距離,這代表滑鼠就算拖曳同樣的距離,在Canvas寬高不同時結果也會不同。

所以不管Canvas寬高是多少,我們都把距離轉換為0到1:
開啟Controller腳本,新增函式SetDistance,以Canvas的寬高為底,將兩點距離調整為0到1:
float SetDistance(Vector2 nowPos, Vector2 startPos)
{
    Vector2 temp = nowPos - startPos;
    temp = new Vector2(temp.x / canvasRect.sizeDelta.x, temp.y / canvasRect.sizeDelta.y);
    float dis = Vector2.Distance(temp, Vector2.zero);
    return dis;
 }
將前面的float dis = Vector2.Distance(nowPos, startPos);改為:
float dis = SetDistance(nowPos, startPos);
這樣我們就解決了同比例不同寬高的移動距離,移動速度就靠改變speed來調整。
另外在Canvas寬高不同比例的情況時,上述的做法並不合適,但目前並沒有去考慮要如何做,所以這個問題就先放一邊,這次就到這裡。

沒有留言:

張貼留言

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...