iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

Unity 自主研究學習系列 第 30

Unity自主學習(三十):完美物件移動

那昨天後來自己在玩寫好的腳本時,發現了會有邏輯上的錯誤,導致物件撞牆時,會不斷產生抖動,而之後也去Unity官網找了一下,有沒有適合改善這個問題的程式在,後來找到一個。通過更改物件"rigidbody.velocity"的數值來移動物件。他是通過改變"rigidbody"的向量速度,來達到物件移動的效果,這樣就不會產生物件穿到牆裡,又被排出的抖動畫面了。
Unity官方提供的rigidbody.velocity描述:
https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html
那一樣我直接用Unity提供的範例程式,融到本來的程式碼裡試試。
那包含跳躍在內,所有的移動都變得更加滑順,但因為我們改變的是速度,所以當按鍵放開,物件還是會往前滑行一小段距離。物件的移動是滑出去之後,慢慢減速的。所以還有地方需要再更改。
Yes

那因為我們的程式是改變速度,當我們放開按鍵時,速度是慢慢減少的,為了讓物件馬上停下,所以在放開按鍵的同時,也將速度重製為零就好了。

Yes

更改完之後,移動就照著預想的行動了,不過跳躍部分還是有點問題,當跳躍起來移動時,物體就會卡在半空中,那麼這又是要另外解決的問題。那這是因為我們速度的程式是用new Vector3去設定速度的,當我們移動某個方向時,其他方向的速度都使其歸0,那麼只要指定特定軸的速度,我想應該就可以了。
實際弄出來之後,是可以正常執行了,而跳躍為了避免連跳,也多了一個判斷,物件高度必須低於1,才能跳起來。

Yes

那最後完整的程式碼大概是這樣:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    public Rigidbody rb;
    private Vector3 jpdown;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    void Update()
    {
        if (Input.GetKey(KeyCode.UpArrow))
        {
            jpdown.z = 5;
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            jpdown.z = -5;
        }
        if (Input.GetKeyUp(KeyCode.DownArrow) || Input.GetKeyUp(KeyCode.UpArrow))
        {
            jpdown.z = 0;
        }

        if (Input.GetKey(KeyCode.RightArrow))
        {
            jpdown.x = 5;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            jpdown.x = -5;
        }
        if (Input.GetKeyUp(KeyCode.LeftArrow)|| Input.GetKeyUp(KeyCode.RightArrow))
        {
            jpdown.x = 0;
        }

        if (Input.GetKeyDown(KeyCode.Space) && transform.localPosition.y <= 1)
        {
            rb.AddForce(Vector3.up * 350);
        }
        jpdown.y = rb.velocity.y;
        rb.velocity = jpdown;
    }
}

那麼30天挑戰雖然結束了,但Unity的學習不會結束,謝謝陪了我30天的各位!ε(*´・∀・`)з゙
之後有緣再見吧!!!


上一篇
Unity自主學習(二十九):物件移動錯誤
系列文
Unity 自主研究學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言