タイトル通り、あるトリガー内で一定のキーを押すとドアが自動的に開き、画面がフェードアウトするというスクリプトを書いています。
http://tsubakit1.hateblo.jp/entry/2015/02/20/235021
こちらのページを参考に、ドアが開くアニメーションのスクリプトを作成したのですが、
ページによるとドア移動の開始時間(startTime)や経過時間(diff)に、シーン読み込み時からの時間(Time.timeSinceLevelLoad)を取得しており、シーン読み込み直後からのアニメーションに最適となっているようです。
この状態で一連の流れをプレビューすると、シーン読み込みした瞬間から見た移動指定時間(time)が経過した状態でトリガーの中に入り、一定のキーを押すと、すでに移動し終わった状態にパッと切り替わるようになってしまいます。移動指定時間内に間に合うと、初期位置から、パッと再生途中の移動アニメーションに切り替わります。
一定のキーが押された瞬間の時間を開始時間とすることができれば、キーを押す→ドアのアニメーションが再生される→フェードアウトが始まる、と理想の流れになると考えているのですが、なかなか思うように行きません(deltaTimeを使うのかと考えているのですが……)。
書き方が違うのか、考え方がそもそも違うのかなど、お力添えいただけますと幸いです。
一連の流れに使っているスクリプトは以下の通りです。
C#
1//ドアの移動アニメーション 2public class doorWork : MonoBehaviour 3{ 4 5 [SerializeField, Range(0, 10)] 6 float time = 1; 7 8 [SerializeField] 9 Vector3 endPosition; 10 11 [SerializeField] 12 AnimationCurve curve; 13 14 private float startTime; 15 private Vector3 startPosition; 16 17 void OnEnable () 18 { 19 if (time <= 0) 20 { 21 transform.localPosition = endPosition; 22 enabled = false; 23 return; 24 } 25 26 startTime = Time.timeSinceLevelLoad; 27 startPosition = transform.localPosition; 28 } 29 30 void Update () 31 { 32 if (toNextScene.openFlag == true) 33 { 34 var diff = Time.timeSinceLevelLoad - startTime; 35 if (diff > time) 36 { 37 transform.localPosition = endPosition; 38 enabled = false; 39 toNextScene.FOflag = true; //ドアが開ききったらフェードアウト(別スクリプト) 40 } 41 42 var rate = diff / time; 43 var pos = curve.Evaluate(rate); 44 45 transform.localPosition = Vector3.Lerp (startPosition, endPosition, pos); 46 } 47 } 48} 49
C#
1//一定範囲に入ってエンターキーを押すとドアが開いてフェードアウトする 2public class toNextScene : MonoBehaviour { 3 4 private Image panel; 5 float palpha; 6 float palphaSpeed = 0.02f; 7 8 public string nextScene; 9 10 public static bool FOflag; 11 public static bool openFlag; 12 13 void Start () 14 { 15 panel = GameObject.Find ("Panel_FO").GetComponent<Image> (); 16 palpha = 0.0f; 17 panel.color = new Color (0, 0, 0, palpha); 18 panel.enabled = false; 19 20 FOflag = false; 21 openFlag = false; 22 } 23 24 25 void Update () 26 { 27 if (FOflag == true) //ドアが開ききったらフェードアウト 28 { 29 panel.enabled = true; 30 palpha += palphaSpeed; 31 if (palpha > 1) 32 { 33 palpha = 1; 34 SceneManager.LoadScene (nextScene); 35 } 36 panel.color = new Color (0, 0, 0, palpha); 37 } 38 } 39 40 void OnTriggerStay(Collider col) //トリガー内でエンターキーを押すとドアが開き始める 41 { 42 if (col.gameObject.tag == "chara") 43 { 44 if (Input.GetKeyDown (KeyCode.Return)) 45 { 46 openFlag = true; 47 } 48 } 49 } 50}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。