自動ドアに応用したくてLerpを用いたプログラミングをしました。
座標AからBまで進み、Bとの距離が十分小さくなったらAに向かって進む、を繰り返すスクリプトを書いたつもりでしたが、Bで止まってしまって困っています。
原因を教えていただければ自分で考えて直してみます。
以下はその動画とスクリプトです。
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class AutoDoorOpen : MonoBehaviour 6{ 7 8 public Transform startLocation;//開始位置のTransform 9 public Transform endLocation;//終了位置のTransform 10 public float moveSpeed = 50.0f;//開くときの移動速度 11 public float reverseMoveSpeed = -50.0f;//閉まるときの移動速度 12 public float purposeDistance = 1.0f;//ドアと目的地の距離 13 14 private float startTime;//開始時間 15 private float journeyLength;//移動距離 16 17 18 // Start is called before the first frame update 19 void Start() 20 { 21 //移動に必要な距離を計算 22 journeyLength = Vector3.Distance(startLocation.position, endLocation.position); 23 24 } 25 26 // Update is called once per frame 27 void Update() 28 { 29 //ドアの位置を取得 30 Vector3 currentPosition = transform.position; 31 32 //ドアの位置がstartLocation付近にあるなら(Mathf.Absで絶対値に直す) 33 if (Mathf.Abs(Vector3.Distance(currentPosition, startLocation.position)) < purposeDistance) 34 { 35 //移動した距離を計算 36 float distCovered = (Time.time - startTime) * moveSpeed; 37 38 //現在の位置をLerpで求める 39 float fracJourney = distCovered / journeyLength; 40 transform.position = Vector3.Lerp(startLocation.position, endLocation.position, fracJourney); 41 42 //開始時間を更新 43 startTime = Time.time; 44 } 45 46 //ドアの位置がendLocation付近にあるなら 47 else if (Mathf.Abs(Vector3.Distance(currentPosition, endLocation.position)) < purposeDistance) 48 { 49 //移動した距離を計算 50 float distCovered = (Time.time - startTime) * reverseMoveSpeed; 51 52 //現在の位置をLerpで求める 53 float fracJourney = distCovered / journeyLength; 54 transform.position = Vector3.Lerp(startLocation.position, endLocation.position, fracJourney); 55 56 //開始時間を更新 57 startTime = Time.time; 58 } 59 60 } 61}
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。