前回オブジェクトを線でつなぎましたが 今回はその線の上を移動するプレーヤー(オブジェクト)を設定します
1.プレーヤーをシーン内にドラッグ&ドロップ
レイヤーの順序が0のためApartの下にあります
2.プレーヤにアニメーターとLineMoverというスクリプトを追加
アニメーターの追加方法はこちらをご覧ください
everydayisagoodday.hatenadiary.com
everydayisagoodday.hatenadiary.com
3.LineMoverスクリプトを編集
using UnityEngine; public class LineMover : MonoBehaviour { [SerializeField] LineRenderer line; [SerializeField] float speed = 1f; private Animator anim; private int currentIndex; private void Start() { anim = this.GetComponent<Animator>(); currentIndex = 0; transform.position = line.GetPosition(currentIndex); GetComponent<SpriteRenderer>().sortingOrder += 3; } private (Vector3 targetPosition, bool isEnd) GetTargetPosition(float moveSpeed,Vector3 currentPosition) { int nextIndex = currentIndex + 1; if (line.positionCount <= nextIndex) { return (line.GetPosition(currentIndex) + line.transform.position, true); } Vector3 nextPosition = line.GetPosition(nextIndex) + line.transform.position; float distance = Vector3.Distance(currentPosition, nextPosition); if (distance < moveSpeed) { currentIndex += 1; return GetTargetPosition(moveSpeed - distance,nextPosition); } else { Vector3 direction = (nextPosition - currentPosition).normalized; return (currentPosition + direction * moveSpeed, false); } } private void Update() { var result = GetTargetPosition(speed * Time.deltaTime,transform.position); if (result.targetPosition.x>transform.position.x) { //右向き anim.SetFloat("X", 1f); anim.SetFloat("Y", 0); } else if (result.targetPosition.x < transform.position.x) { //左向き anim.SetFloat("X", -1f); anim.SetFloat("Y", 0); } else if (result.targetPosition.y > transform.position.y) { //後ろ向き anim.SetFloat("X", 0); anim.SetFloat("Y", 1f); } else { //前向き anim.SetFloat("X", 0); anim.SetFloat("Y", -1f); } transform.position = result.targetPosition; if (result.isEnd) { this.gameObject.SetActive(false); } } }
4.LineMoverスクリプトにLineオブジェクトをドラッグ&ドロップ
これで実行すると線の上をプレーヤーが移動するようになります