質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1509閲覧

unityでオブジェクト(テレポーター)に接触した場合、シーンAからシーンBへプレイヤー(追尾するカメラ等を含む)を移動させたい

freebee

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/09/07 18:14

編集2018/09/07 19:14

前提・実現したいこと

初心者ですがよろしくお願いします。

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

freebee

2018/09/08 12:15

ずっと困っていたので助かりました! 問題なく実行できました。説明も丁寧でわかりやすく、本当に感謝します! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問