
扉の前にいる時下方向のキー入力でシーンを移動したい
某カー〇ィのような感じでシーン間を移動したかったので下記のようなスクリプトを作ったのですが、これが非常に安定しなかったので書き換えることにしました。
public class toHome : MonoBehaviour
{
public void OnTriggerStay2D(Collider2D collision)
{
if (Input.GetKeyDown(KeyCode.S))
{
//プレイヤーのPlayerスクリプト取得
var player = collision.GetComponent<Player>();
//ゴール処理呼び出し
player.SceneMove();
Invoke("OnLoadScene", 2);
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
//プレイヤーのPlayerスクリプト取得
var player = collision.GetComponent<Player>();
//ゴール処理呼び出し
player.SceneMove();
Invoke("OnLoadScene", 2);
}
}
public void OnLoadScene()
{
SceneManager.LoadScene("Title");
}
}
toHome.csの内容を大まかに言うとこんな感じ。
Colliderの判定に何かが接触し続けている時(OnTriggeStay2D)に下方向のキー入力がされた場合、2秒後にシーン遷移
で、おそらくOnTriggerStay2Dが原因だろうと目星を付けて、下記のような処理に書き換えました。
public class toHome : MonoBehaviour
{
//ドアフラグ
public bool is_Title;
GameObject player;
Player script;
float vertical;
private void Start()
{
is_Title = false;
//プレイヤーオブジェクトを変数に格納,スクリプトを取得
player = GameObject.Find("Basic Player Controller");
script = player.GetComponent<Player>();
}
public void OnTriggerEnter2D(Collider2D collision)
{
if (collision.name.Contains("Player"))
{
//Debug.Log("Titleフラグon");
is_Title = true;
}
}
public void OnTriggerExit2D(Collider2D collision)
{
if (collision.name.Contains("Player"))
{
//Debug.Log("Titleフラグoff");
is_Title = false;
}
}
public void Update()
{
var vertical = Input.GetAxis("Vertical");
if (vertical < 0 && is_Title == true)
{
script.SceneMove();
Invoke("OnLoadScene", 2);
}
}
public void OnLoadScene()
{
SceneManager.LoadScene("Title");
}
}
内容としてザックリこんな感じ。
下方向の入力がされている かつ ドアフラグ(is_Title)が真である場合、
2秒後に遷移処理
これで安定して処理が実行されるようになりました。
原因
スクリプトリファレンスを見る限りOnTriggerStay2Dは常に毎フレーム呼び出され続けている関数では無いので、キー入力のタイミングと噛み合っていなかったというのが原因っぽいです。
つまり1個目のコードの場合、処理が行われるのはOnTriggerStay2Dが呼び出されたフレームと同時にキー入力が為された場合、ということでしょうか。そりゃ安定しない。
*追記
TwitterでOtsukaさん(@otsuka_game)からOnTrigger系の呼び出しタイミングはFixedUpdateだと教えていただきました。また物理演算と同期しているそうです。
FixedUpdateはProjectSetting>Time>Fixed Timestepで呼び出し間隔を設定することが出来、デフォルトだと50fps換算で0.02秒毎呼び出されています。
Fixed Timestepは「Outlet」で移動がカクカクしている問題が発生した際、アドバイスを受けて数値を変更したことがありました。覚えておくと良さそうです。