国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity】如何優(yōu)雅地移動物體-8個方法

這篇具有很好參考價值的文章主要介紹了【Unity】如何優(yōu)雅地移動物體-8個方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在游戲開發(fā)中,如何移動物體?是我們需要思考的事情。
Unity 引擎也提供了眾多的方法,每個開發(fā)者的使用習(xí)慣也各不相同,所以往往不是很清楚在這種場景下哪種方式最好的或者最有效的。
那么,這篇文章,我想分享一下移動物體的一些方法和優(yōu)缺點。

【Unity】如何優(yōu)雅地移動物體-8個方法

【Unity】如何優(yōu)雅地移動物體-8個方法

項目地址

倉庫地址

如何優(yōu)雅地移動物體?8個方法

向某個方向移動

Transform.Position

眾所周知,我們可以給對象的Transform組件賦予一個坐標(biāo)來決定其位置。

transform.position = new Vector3(2, 1, 0);

當(dāng)我們每一幀給對象賦予一個新的坐標(biāo),那么看起來,這個物體就是在運動的。

    void Update()
    {
        var dir = new Vector3(0.02f, 0, 0);
        transform.position += dir;
    }

效果如下:
【Unity】如何優(yōu)雅地移動物體-8個方法

Transform.Translate()

由于直接改變 Position 屬性看起來不太優(yōu)雅。所以 Transform 組件提供了一個更友好的方法:Transform.Translate()

      void Update()
    {
        var dir = new Vector3(0.02f, 0, 0);
        transform.Translate(dir);
    }

其實,他的內(nèi)部與 Transform.Position無異。

 public void Translate(Vector3 translation, [DefaultValue("Space.Self")] Space relativeTo)
    {
      if (relativeTo == Space.World)
        this.position += translation;
      else
        this.position += this.TransformDirection(translation);
    }

效果與 Transform.Position 一致
【Unity】如何優(yōu)雅地移動物體-8個方法

但是這種方法產(chǎn)生了一個問題。由于設(shè)備之間的差異或者動態(tài)數(shù)據(jù)的變化會導(dǎo)致每一幀之間的間隔是不相等的,因此,如果以幀數(shù)來控制物體移動,物體的移動距離就沒辦法準(zhǔn)確把握。
效果如下
【Unity】如何優(yōu)雅地移動物體-8個方法
所以我們需要在原來的基礎(chǔ)上乘以 Time.deltaTime屬性的值,從而保證每秒移動的距離是一致的。

void Update() 
{
     var dir = new Vector3(2f, 0, 0)*time;
     transform.Translate(dir);
}

這樣不同的幀數(shù)移動距離都會一致。
效果如下:
【Unity】如何優(yōu)雅地移動物體-8個方法

但這還不夠優(yōu)雅。在游戲中,我們經(jīng)常需要改變物體的速度。為了方便實現(xiàn),我們通常會使用單位向量來確定方向,增加一個浮點值來控制速度。

public float speed = 2;
void Update()
{
    var dir = new Vector3(2,0,0)
    transform.Translate(dir.normalized * speed * Time.deltaTime);
}

移動到指定位置

移動到指定位置,大概有兩種方式。

  1. 速度:物體通過特定速度向目標(biāo)移動。
  2. 時間:物體在時間內(nèi)到達(dá)目標(biāo)。

Vector3.MoveTowards():固定速度

以固定的速度移動到目標(biāo)位置

public Vector3 targetPosition;
public float speed=10;
void Update()
{
    transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
}

效果:
【Unity】如何優(yōu)雅地移動物體-8個方法

Vector3.SmoothDamp():平滑移動

又或者,我們可以用平滑的方式到達(dá)目標(biāo)位置。(平滑:到達(dá)位置前提前減速)

public Vector3 targetPosition;
public float smoothTime = 0.5f; 
public float speed = 10;
Vector3 velocity ;
void Update()
{
    transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime, speed);
}

效果:
【Unity】如何優(yōu)雅地移動物體-8個方法

Vector3.Lerp():線性時間移動

該方法的意思是在調(diào)用方法期間,已經(jīng)過的時間除以總持續(xù)時間,得到當(dāng)前的位移目標(biāo)。

 // 終點
    public Vector3 targetPosition;
    // 開始位置
    public Vector3 startPosition;
    // 持續(xù)時間
    public float lerpDuration = 4;
    // 記錄運行時間
    private float _timeElapsed = 0;
    
    void Start()
    {
        startPosition = transform.position;
    }

    void Update()
    {
        // 記錄下一個位置
        Vector3 valueToLerp;
        _timeElapsed += Time.deltaTime;
        if (_timeElapsed < lerpDuration)
        {
            valueToLerp  = Vector3.Lerp(startPosition, targetPosition, _timeElapsed / lerpDuration);
        }
        else
        {
            valueToLerp = targetPosition;
        }
        transform.position = valueToLerp;
    }

效果如下:
【Unity】如何優(yōu)雅地移動物體-8個方法

以上的這些方法足以讓我們準(zhǔn)確且隨心的操縱物體移動。
但有一些場景,我們并不希望如此精確或始終如一的運動軌跡,我們想物體的移動受 Unity 的物理引擎影響或者其他物體影響。
同時如果用以上方法移動,在 Unity 的物理引擎下會出現(xiàn)抖動,穿過剛體等奇怪的現(xiàn)象。
【Unity】如何優(yōu)雅地移動物體-8個方法

那么接下來,我們就需要用到一些涉及到物理引擎的移動方式。

物理引擎移動

Rigidbody.AddForce()

使用這個方法給物體添加一個方向力。在力的作用下,物體將會移動。那么移動速度和位移就會與物理特效有關(guān),比如物體質(zhì)量,阻力,甚至還有重力。

一般會有兩種使用方式。
在初始時給物體一個力,讓其順著物理規(guī)律下運動。使用場景一般時跳躍或者碰撞。

    // 賦予200的力
    public float force = 200;
    private Rigidbody2D _rigidbody2D;
    // 移動方向
    private Vector3 dir = Vector3.right;
    
    void Start()
    {
        _rigidbody2D = GetComponent<Rigidbody2D>();
        _rigidbody2D.AddForce(Vector2.right * force);
    }

為了更好演示剛體的運動,我還給剛體的線性阻力改為1,這樣沒有持續(xù)施加外力的情況下,物體會因為摩擦力的存在而停下。
【Unity】如何優(yōu)雅地移動物體-8個方法
效果如下:
可以看到物體很快就停下了
【Unity】如何優(yōu)雅地移動物體-8個方法

第二種,會在每一幀持續(xù)給物體施加力,使物體可以持續(xù)運動。

 // 賦予2的力
    public float force = 2;
    private Rigidbody2D _rigidbody2D;
    // 移動方向
    private Vector3 dir = Vector3.right;
    void Start()
    {
        _rigidbody2D = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        _rigidbody2D.AddForce(Vector2.right * force);
    }

效果如下:
【Unity】如何優(yōu)雅地移動物體-8個方法
從效果可以看到,在持續(xù)給外力的作用下,物體移送越來越快,但在阻擋物前會停下。

Rigidbody.Velocity

直接賦予 Velocity 屬性一個向量,可以立即改變物體的速度。一般情況下,我們不需要直接修改速度,除非你非常明確需要立即改變物體的速度。

    public float speed = 10;
    private Rigidbody2D _rigidbody2D;
    // 移動方向
    private Vector3 dir = Vector3.right;
    
    void Start()
    {
        _rigidbody2D = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        _rigidbody2D.velocity = dir * speed;
    }

效果如下:
看到物體一開始就已經(jīng)有速度,而通過AddForce方法添加力的物體,速度時慢慢提高的。
【Unity】如何優(yōu)雅地移動物體-8個方法

Rigidbody.MovePosition()

該方法有比較局限的使用場景,當(dāng)物體的剛體類型是 Kinematic 時,使用Rigidbody.MovePosition() 方法進(jìn)行移動。
因為 Kinematic 類型下,不會受到重力和AddForce、AddTorque等力相關(guān)的函數(shù)的影響?。?!

	public float speed = 10;
    private Rigidbody2D _rigidbody2D;
    // 移動方向
    private Vector3 dir = Vector3.right;
    
    void Start()
    {
        _rigidbody2D = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        var positon = dir * (speed * Time.deltaTime);
        _rigidbody2D.MovePosition(transform.position + positon);
    }

效果如下:
【Unity】如何優(yōu)雅地移動物體-8個方法

剛體類型是 Kinematic 時 ,會對剛體類型為 Dynamic 施加力,而無視 static 類型。

在文末,歡迎在評論區(qū)發(fā)表你的見解。如果覺得寫的不錯,可以給我點贊,鼓勵一下,謝謝。文章來源地址http://www.zghlxwxcb.cn/news/detail-406754.html

到了這里,關(guān)于【Unity】如何優(yōu)雅地移動物體-8個方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Unity 通過鍵盤鼠標(biāo)控制物體移動、旋轉(zhuǎn)、縮放的方法

    在Unity中,使用鍵盤ADWS鍵控制物體移動,通過鼠標(biāo)左鍵控制物體旋轉(zhuǎn),鼠標(biāo)中鍵控制物體縮放是再常見不過的方法。 方法如下: ?效果如下:Unity 通過鍵盤鼠標(biāo)控制物體移動、旋轉(zhuǎn)、縮放_嗶哩嗶哩_bilibili

    2024年02月03日
    瀏覽(24)
  • Unity 語法詳解之查找游戲物體的方法(含查找隱藏物體)

    Unity 語法詳解之查找游戲物體的方法(含查找隱藏物體)

    為了更好的看懂,有一個非?;A(chǔ)的知識,如果不知道可以移步去了解一下哦 unity | gameobject和transform的區(qū)別和關(guān)聯(lián)通俗解釋_gameobject transform_菌菌巧樂茲的博客-CSDN博客 一、前情提要 大寫的 GameObject是個類,里面寫滿了物體有關(guān)的代碼 小寫的 gameObject指的是物體本身 大寫的

    2024年02月12日
    瀏覽(22)
  • [Unity] 使用Mathf函數(shù)實現(xiàn)平滑移動物體的7種方法

    [Unity] 使用Mathf函數(shù)實現(xiàn)平滑移動物體的7種方法

    ?Unity中要利用Mathf中的函數(shù)實現(xiàn)物體的平滑運動,有以下7種方法: Mathf.SmoothDamp、Mathf.Lerp、Mathf.SmoothStep三個方法非常相似,分別使用三個方法移動同一個物體的效果如圖所示: 可以看出,三者均是先快后慢,但SmoothDamp方法會有一些卡頓;SmoothStep與Lerp比較起來,Mathf.Smooth

    2024年02月12日
    瀏覽(18)
  • 【Unity自制手冊】基于Unity中物體移動相關(guān)方法和API集錦(動圖詳解)

    【Unity自制手冊】基于Unity中物體移動相關(guān)方法和API集錦(動圖詳解)

    ?????個人主頁 :@元宇宙-秩沅 ????? hallo 歡迎 點贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 秩沅 原創(chuàng) ????? 收錄于專欄 : unity每日一記 ?相關(guān)文章: 線性差值函數(shù)以及平滑阻尼的運用和實踐(Lerp AND SmoothDamp) ?相關(guān)文章:基礎(chǔ)不牢,地動山搖系列 ------ 軟

    2024年01月16日
    瀏覽(63)
  • 【筆記】Unity2D角色和物體移動的幾種方法

    在Unity中對于物體移動有多種方法,這里根據(jù)b站up主【鼓勵Jun】的視頻整理了一些筆記 變量聲明: 位移向量var dir=new Vector3(deltax.deltay,deltaz); 移動速度var speed=2; ps:變量聲明都在主要都在方法外,實際位移操作則在Update方法中。 #鍵盤輸入,這里舉一個只x軸上移動的例子,y軸同

    2023年04月08日
    瀏覽(21)
  • Unity之獲取游戲物體對象或組件的幾個方法

    在unity的實際項目開發(fā)中,往往都要獲取游戲內(nèi)的各種物體,比如玩家(Player),怪物(Monster),或者其他,那有什么方法可以快速獲取呢,下面就來介紹unity獲取游戲?qū)ο蟮膸讉€方法 GameObject.Find GameObject.Find 通過游戲物體的名稱獲取對象 使用方法 缺點: 會遍歷當(dāng)前整個場

    2024年02月01日
    瀏覽(25)
  • Unity學(xué)習(xí)筆記--如何優(yōu)雅簡便地利用對象池生成游戲?qū)ο螅ㄟM(jìn)階版)LRU + 對象池

    之前寫過一篇關(guān)于對象池的文章,現(xiàn)在來看寫的并不是很好,所以來考慮優(yōu)化下。 現(xiàn)在來看一年前寫的代碼,越看越不能入目hhh Unity學(xué)習(xí)筆記–如何優(yōu)雅簡便地利用對象池生成游戲?qū)ο?Unity學(xué)習(xí)筆記–使用 C# 開發(fā)一個 LRU PoolManager.cs BaseFactory.cs 創(chuàng)建 Factory 創(chuàng)建 object 創(chuàng)建 Bu

    2024年02月13日
    瀏覽(93)
  • Unity之用代碼移動物體(平滑移動)

    因為移動的起點和終點都是不確定,所以這里用代碼進(jìn)行實現(xiàn)而不是動畫(試過動畫,但是發(fā)現(xiàn)無法成功添加clip) 物體移動常用的有兩個方法,一個是Mathf.MoveTowards,一個是Mathf.Lerp,他們都用于值的平滑過渡 Mathf.MoveTowards? ????????current:起點位置 ????????target:目

    2024年02月07日
    瀏覽(28)
  • Unity點擊物體后,移動到物體所在位置

    Unity點擊物體后,移動到物體所在位置

    腳本掛在被點擊的物體上 腳本掛在角色控制器上 改進(jìn):使用Raycast中的LayerMask 創(chuàng)建“cube”層 將想要被檢測的物體放入該層 3.1、 3D物體事件監(jiān)聽 在相機上掛Physics Raycaster組件 檢查是否有EventSystem 將腳本掛在被點擊的物體上 添加組件Event Trigger組件 3.2、 世界UI世界監(jiān)聽

    2024年02月07日
    瀏覽(22)
  • 【Unity】攝像機跟隨鼠標(biāo)移動以物體為中心旋轉(zhuǎn) 物體根據(jù)視線方向移動

    【Unity】攝像機跟隨鼠標(biāo)移動以物體為中心旋轉(zhuǎn) 物體根據(jù)視線方向移動

    描述 實現(xiàn)攝像機根據(jù)鼠標(biāo)移動跟隨物體旋轉(zhuǎn),以攝像機前物體為中心,攝像機圍繞物體旋轉(zhuǎn),并使攝像機時刻指向物體 實現(xiàn)效果 Unity 組件設(shè)置 Camera 組件設(shè)置 Body 組件設(shè)置 實現(xiàn)代碼 CameraRotateMove.cs 攝像機跟隨和旋轉(zhuǎn) move_better.cs 物體根據(jù)按鍵移動

    2024年02月08日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包