前提・実現したいこと
初心者ですがよろしくお願いします。
unityでオブジェクト(テレポーター)に接触した場合、シーンAからシーンBへプレイヤー(追尾するカメラ等を含む)を移動させたいと思っています。
今はシーンAとシーンB両方にプレハブのプレイヤーを配置し切り替えているのですが、それでは移動ではなく切り替えになってしまいます。
将来的にプレイヤーのステータス(ダメージ情報含む)や所持品なども移動させたいです。
それとシーンAのテレポーター東は、シーンBのテレポーター西に繋がるなど場所の指定をしたいです。
出来ればお手本のスクリプトを記入していただけると大変助かります。
試したこと
現在使用しているスクリプトは以下の通りです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Teleport : MonoBehaviour {
private void OnTriggerEnter(Collider other) { Debug.Log("移動した"); SceneManager.LoadScene("シーンA"); }
}
補足情報(FW/ツールのバージョンなど)
unity 2018.1.ob13
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
プレイヤー退避用のシーンに移動する、またはDontDestroyOnLoadでプレイヤーの破壊を防いで、シーン移動後に新しいシーンに復帰させるというのではどうでしょうか?
テレポーターのスクリプト
テレポーターにアタッチ後、インスペクタであらかじめ移動先シーン名・移動先テレポーター名を設定しておく
C#
1using UnityEngine; 2 3namespace Teleport 4{ 5 public class Teleporter : MonoBehaviour 6 { 7 public string DestinationScene; 8 public string DestinationTeleporter; 9 } 10}
プレイヤーのスクリプト
C#
1using System.Linq; 2using UnityEngine; 3using UnityEngine.SceneManagement; 4 5namespace Teleport 6{ 7 public class Player : MonoBehaviour 8 { 9 public float Speed = 4.0f; 10 private Transform cameraTransform; 11 private string destinationSceneName; 12 private string destinationTeleporterName; 13 private bool ignoreTriggerEnterOnce; 14 private new Rigidbody rigidbody; 15 private Vector3 velocity; 16 17 private void OnTriggerEnter(Collider other) 18 { 19 // シーン移動直後に再びテレポーターと接触した際に、またシーン移動してしまうと 20 // 困るので、OnTriggerEnter無視モードを設ける 21 // もし無視モードなら無視モードを解除して、後は何もしない 22 if (this.ignoreTriggerEnterOnce) 23 { 24 this.ignoreTriggerEnterOnce = false; 25 return; 26 } 27 28 // テレポーターには「Teleporter」タグを付けておき、接触相手を識別する 29 if (other.tag != "Teleporter") 30 { 31 return; 32 } 33 34 // 接触相手からTeleporterを取得、失敗すれば何もしない 35 var teleporter = other.GetComponent<Teleporter>(); 36 if (teleporter == null) 37 { 38 return; 39 } 40 41 // 接触相手のTeleporterを見て、移動先シーン・移動先テレポーター名を調べる 42 this.destinationSceneName = teleporter.DestinationScene; 43 this.destinationTeleporterName = teleporter.DestinationTeleporter; 44 45 // OnTriggerEnter無視モードにする 46 this.ignoreTriggerEnterOnce = true; 47 48 // シーン遷移で自身が削除されないようにする 49 DontDestroyOnLoad(this.gameObject); 50 51 // シーン移動後のイベントハンドラーをセットしてからシーンを移動 52 SceneManager.sceneLoaded += this.OnSceneLoaded; 53 SceneManager.LoadScene(this.destinationSceneName); 54 } 55 56 private void OnSceneLoaded(Scene scene, LoadSceneMode mode) 57 { 58 // イベントハンドラーを解除 59 SceneManager.sceneLoaded -= this.OnSceneLoaded; 60 61 // 設計にもよるでしょうが、初期シーンにプレイヤーを直接配置していると 62 // 初期シーン戻ってきた時にプレイヤーがもう一人現れるかもしれません 63 // このへんは設計に応じて適宜対処してみてください 64 foreach (var player in GameObject.FindGameObjectsWithTag("Player")) 65 { 66 if (player != gameObject) 67 { 68 Destroy(player); 69 } 70 } 71 72 // 移動先のテレポーターを探す 73 var destination = GameObject 74 .FindGameObjectsWithTag("Teleporter") 75 .FirstOrDefault(o => o.name == this.destinationTeleporterName); 76 if (destination == null) 77 { 78 Debug.LogErrorFormat("Teleporter {0} not found!", this.destinationTeleporterName); 79 } 80 else 81 { 82 // 自身の位置を移動先テレポーターの位置にセット 83 this.rigidbody.position = destination.transform.position; 84 } 85 86 // 自身を移動先シーンのヒエラルキーに移す 87 SceneManager.MoveGameObjectToScene(this.gameObject, SceneManager.GetSceneByName(this.destinationSceneName)); 88 } 89 90 // 以下はプレイヤー操作用のコードですので、シーン間移動には関係ありません 91 // ご質問者さんの設計に合わせたやり方でやってみてください 92 93 private void Start() 94 { 95 this.rigidbody = this.GetComponent<Rigidbody>(); 96 this.cameraTransform = this.GetComponentInChildren<Camera>().transform; 97 } 98 99 private void Update() 100 { 101 var forward = Vector3.Scale(this.cameraTransform.forward, new Vector3(1.0f, 0.0f, 1.0f)).normalized; 102 var right = this.cameraTransform.right; 103 this.velocity = ((Input.GetAxis("Horizontal") * right) + (Input.GetAxis("Vertical") * forward)) * 104 this.Speed; 105 } 106 107 private void FixedUpdate() 108 { 109 this.rigidbody.MovePosition(this.rigidbody.position + (this.velocity * Time.fixedDeltaTime)); 110 } 111 } 112}
投稿2018/09/07 22:48
総合スコア10807
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/08 12:15