一方向だけでなく、逆方向へも自動で進めるムービングウォークを作ってみましょう。
スタート地点から、指定した地点に向かって自動で動いていきます。
逆に、元の地点に戻ることもでき、行き帰りが可能になります。

関連記事:
エレベーターをつくる
エリアに入れば自動で移動(ムービングウォーク)
触れると他の位置へワープする
空間の中でクリックした位置へ行く
指定した座標(目的地点)へ行く
2点間の往復運動をくり返す
2つの座標(目的地)へ行く
触れると2地点を行き来するオブジェクト
斜め上に向けて自動移動
スタート地点とゴール地点をつくる
床オブジェクトとしてPlaneを作成し、Yを-0.5に下げておきます。

空のオブジェクトを作成し、名前をStartStopPointにします。
スタート地点として、座標を変更します。

この子オブジェクトとして、もう一つ空のオブジェクトを作成しましょう。
StartStopPointを右クリックして、空のオブジェクトを作成。
名前をStartRunPointに変更。
わかりやすくるため、アイコンを設定しておきます。
空のオブジェクトが2つ、同じ位置で親子関係になっている状態です。

StartStopPoint、StartRunPointともに、スフィアコライダーを追加。
半径を0.1にして、トリガーにするにチェックを入れます。

続いて、ゴール地点のポイントを作成しましょう。
StartStopPointを複製します。
親オブジェクトをGoalStopPoint、子オブジェクトをGoalRunPointに名前を変更。
位置を、ゴール地点の座標として設定します。

GoalRunPointのアイコンを変更しておきます。

シーンビューを上からみると、このように配置されています。
赤がスタート、青がゴールとなっています。

それぞれの親オブジェクトに、プログラムを追加します。
PointScript.csを作成し、StartStopPoint と GoalStopPoint に追加します。

PointScript.csを記述します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21  | 
						using System.Collections; using System.Collections.Generic; using UnityEngine; public class PointScript : MonoBehaviour {     [SerializeField] GameObject childObj;     void Start()     {         childObj = transform.GetChild(0).gameObject;     }     void OnTriggerExit(Collider other)     {         if (other.gameObject.name == "Cube")         {             childObj.SetActive(true);         }     } }  | 
					
以上で、スタート地点とゴール地点のオブジェクトができました。
双方向で自動移動できるムービングウォーク
プレーヤーとしてCubeを作成しましょう。
リジッドボディを追加し、位置を変更します。

CubeMove.csを作成し、Cubeに追加します。

CubeMove.csを記述します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78  | 
						using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeMove : MonoBehaviour {     public bool flag;     public Transform goalPoint;     public Transform startPoint;     private float cubeSpeed = 3.0f;     private float autoSpeed = 0.1f;     void Update()     {         float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * cubeSpeed;         float moveZ = Input.GetAxis("Vertical") * Time.deltaTime *cubeSpeed;         transform.position = new Vector3 (             transform.position.x + moveX, transform.position.y, transform.position.z + moveZ         );     }     void OnTriggerEnter(Collider other)     {         if (other.gameObject.name == "StartRunPoint")         {             GotoGoal();             flag = false;             other.gameObject.SetActive(false);         }         if (other.gameObject.name == "GoalStopPoint")         {             flag = true;         }         if (other.gameObject.name == "GoalRunPoint")         {             GotoStart();             flag = true;             other.gameObject.SetActive(false);         }         if (other.gameObject.name == "StartStopPoint")         {             flag = false;         }     }     //ゴール位置へ移動     void GotoGoal()     {         StartCoroutine("MoveGoalPoint");     }     IEnumerator MoveGoalPoint()     {         while (!flag)         {             transform.position = Vector3.MoveTowards(transform.position, goalPoint.position, autoSpeed);             yield return new WaitForSeconds(0.01f);         }     }     //スタート位置へ移動     void GotoStart()     {         StartCoroutine("MoveStartPoint");     }     IEnumerator MoveStartPoint()     {         while (flag)         {             transform.position = Vector3.MoveTowards(transform.position, startPoint.position, autoSpeed);             yield return new WaitForSeconds(0.01f);         }     } }  | 
					
2つのフィールドに、それぞれの親オブジェクトを入れましょう。
StartStopPoint と GoalStopPoint をドラッグ&ドロップします。

スタートのタイミングでは、GoalRunPointを非表示にしておく必要があります。
GoalRunPointのチェックを外しておきましょう。

シーンビューを上から見ると、このように表示されています。

ゲームプレイしてみましょう。
スタート地点からゴール地点、ゴール地点からスタート地点。
行き帰りの自動移動が可能になりました。

関連記事:
エレベーターをつくる
エリアに入れば自動で移動(ムービングウォーク)
触れると他の位置へワープする
空間の中でクリックした位置へ行く
指定した座標(目的地点)へ行く
2点間の往復運動をくり返す
2つの座標(目的地)へ行く
触れると2地点を行き来するオブジェクト
斜め上に向けて自動移動