オブジェクトをランダムな点 A から設定点 B に移動する

概要

私は Unity Learn を通じて Unity でのゲームの作成を学習しており、ようやく C# の使用に慣れ始めています。残念ながら、コードに問題が発生しました。私は顧客がレジに向かうゲームを作成しています。顧客をランダムな座標セットからスポーンして、設定されたポイントまで歩く必要があります。

いくつかの異なるチュートリアルやヒントを見ながら、過去に作成したコードを使用してみましたが、すべて同じ結果で終わりました。 ((-7, 5), 7.8, -19) の間でスポーンしてから (-1, 7.8, -7.5) に移動する必要があります。何を試しても、顧客は空中に出現し、目的地よりも上に浮かんでしまいます。座標数値が 2 倍になっているように見えますが、数値を半分にしてもまったく同じことになります。 Rigidbody を追加すれば解決するかもしれないと考えましたが、それは顧客がポイント B だと思われる場所に到達したときに際限なく落下するだけでした。何か提案はありますか?

これは私が現在取り組んでいるコードです。

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

public class CustomerMovement : MonoBehaviour
{
    private Vector3 beginPos = new Vector3(-1f, 7.8f, -19f);
    private Vector3 endPos = new Vector3(-1f, 7.8f, -7.5f);
    public float time = 5;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(Move(beginPos, endPos, time));
    }

    IEnumerator Move(Vector3 beginPos, Vector3 endPos, float time)
    {
        for(float t = 0; t < 1; t += Time.deltaTime / time)
        {
            transform.position = Vector3.Lerp(beginPos, endPos, t);
            yield return null;
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

解決策

このコードをテストすることはできないので、さらに問題が発生した場合はお知らせください。

移動関数を呼び出す前に、初期位置をターゲット範囲内のランダムな座標に設定するだけです。

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

public class CustomerMovement : MonoBehaviour
{
    private Vector3 beginPos = new Vector3(-1f, 7.8f, -19f);
    private Vector3 endPos = new Vector3(-1f, 7.8f, -7.5f);
    public float time = 5;

    void Start()
    {
        Vector3 randomSpawnPos = new Vector3(Random.Range(-7f, 7f), 7.8f, Random.Range(-19f, 7.8f));

        // Initial pos of customers
        transform.position = randomSpawnPos;
        
        StartCoroutine(Move(randomSpawnPos, endPos, time));
    }


    IEnumerator Move(Vector3 beginPos, Vector3 endPos, float time)
    {
        float startY = transform.position.y;

        for(float t = 0; t < 1; t += Time.deltaTime / time)
        {
            Vector3 intermediatePos = Vector3.Lerp(beginPos, endPos, t);

            transform.position = intermediatePos;
            yield return null;
        }
        // 
        transform.position = endPos;
    }

    void Update()
    {
        
    }
}