シーン移動後、プレイヤーを特定の座標に移動させたい。
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 359
シーン移動後、プレイヤーを特定の座標に移動させたい。
ただいまunityで2d横スクロールRPGを制作しております。
プレイヤーが画面端まで行き、シーン移動をすると、次のシーンに遷移し、
次のシーンでもプレイヤーが用意されている状況になっております。
例えばrouka1⇔rouka2となっているとします。
rouka1からrouka2に移動するとrouka2の左端にプレイヤーが配置されており、
逆に、rouka2からrouka1に移動するとrouka1の右端にプレイヤーが配置されるように座標を指定するにはどうすればいいのでしょうか
。回答よろしくお願いいたします。
発生している問題・エラーメッセージ
座標指定の方法がわからないので、シーン遷移後、どの場所からシーン遷移してもプレイヤーが同じ場所になってしまいます。
該当のソースコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class loadscene_rouka1 : MonoBehaviour
{
public GameObject Player;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Player")
{
SceneManager.LoadScene("Rouka1"); //"シーンの名前"
}
}
}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
Unity 2018.4.23f1
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
「unity 位置座標」などで調べたらすぐ出てくるとは思いますが。。
Player.transform.position = new Vector3(x,y,z); // 2dならvector2?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/07/01 10:07
rouka1⇔rouka2⇔rouka3となっていた際、
rouka1→rouka2の場合、rouka2のシーンで左端にプレイヤーを置きたい。
rouka3→rouka2の場合、rouka2のシーンで右端にプレイヤーを置きたいということです。
これでも同じように、シーン移動の際にプレイヤーを座標指定するだけでできるのでしょうか?
当方初心者で、一週間調べても出てこなかったので質問させていただきました申し訳ございません・・・。
2020/07/01 10:15
rouka1→rouka2の場合は座標変更なし、rouka3→rouka2の場合の場合は上記のように位置を変更する
と言った感じです。
ちなみにシーンを跨ぐデータの扱いは、static変数にする、dontdestroyonloadを使う、一時的にplayerprefs等で保存する、などの方法があります。
2020/07/01 10:20
どこのシーンから来たかをどのように指定するのかわかりません。
2020/07/01 10:29
ただ丸投げするのもあれなので、一番実装が手っ取り早いstaticを用いた方法で記載してみますね。
------------------------------------(データ管理する箇所(class))------------------------------------
public static string LastScene = "rouka1"; // 最後のシーンをチェックするためのstatic変数を用意
------------------------------------(シーン移動する箇所)------------------------------------
LastScene = "rouka2"; // 例えば現在がrouka2だった場合
SceneManager.LoadScene("Rouka1"); // シーンを移動
------------------------------------(初期位置を変更する箇所)------------------------------------
if( LastScene == "rouka2"){
Player.transform.position = new Vector3(x,y,z);
}
-----------------------------------------------------------------------------------------------------------
こんな感じになります。
ちなみに、例示としてstatic変数をあげましたが、staticは規模が大きくなると管理が難しくなる傾向があるので、使用する際は注意してください。
2020/07/01 11:07
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class loadscene_rouka1 : MonoBehaviour
{
public static string LastScene = "Rouka1";
public GameObject Player;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Player")
{
LastScene = "Rouka2"; // 例えば現在がrouka2だった場合
SceneManager.LoadScene("Rouka1"); //"シーンの名前"
}
if (LastScene == "Rouka2")
{
Player.transform.position = new Vector3(8, -1, 0);
}
}
}
2020/07/01 11:08
2020/07/01 11:10
2020/07/01 11:27
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class loadscene_rouka1 : MonoBehaviour
{
public static string LastScene = "Rouka2";
public GameObject Player;
// Start is called before the first frame update
void Start()
{
if (LastScene == "Rouka2")
{
Player.transform.position = new Vector3(8, -1, 0);
}
}
// Update is called once per frame
void Update()
{
}
public void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Player")
{
LastScene = "Rouka2"; // 例えば現在がrouka2だった場合
SceneManager.LoadScene("Rouka1"); //"シーンの名前"
}
}
}
startにいれてしまうとrouka1でこの座標を指定したいのに、rouka2でこの座標からスタートしてしまいます。
2020/07/01 11:48
丁寧にありがとうございます。
2020/07/01 11:54
やはり、2から1に移動する際は、しっかり動いてくれるのですが、startに入れてしまうと、他の場所から1に移動してきても同じ座標に行ってしまいます。
2020/07/01 11:55
using System.Collections.Generic;
using UnityEngine;
public class rouka2kara : MonoBehaviour
{
// Start is called before the first frame update
public static string LastScene = "Rouka2";
public GameObject Player;
void Start()
{
if (LastScene == "Rouka2")
{
Player.transform.position = new Vector3(8, -1, 0);
}
else
{
Player.transform.position = new Vector3(-8, -2, 0);
}
}
// Update is called once per frame
void Update()
{
}
}
2020/07/01 11:55
2020/07/01 11:55
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class loadscene_rouka1 : MonoBehaviour
{
public static string LastScene = "Rouka2";
public GameObject Player;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Player")
{
LastScene = "Rouka2"; // 例えば現在がrouka2だった場合
SceneManager.LoadScene("Rouka1"); //"シーンの名前"
}
}
}
2020/07/01 12:06
また今回の質問内容から、左←→右と、隣接した箇所しか移動しないと想定しましたが、
実際にはシーンはどういう繋がり方を想定していますか?
2020/07/01 12:09
実際は
room1⇔rouka1⇔rouka2
になっており、rouka2で左に入るとrouka1に右から入ることができます。
しかし、現在、room1から右に入り、rouka1で左から入ってこようとすると右に出てきてしまいます。
2020/07/01 12:14
dontdestroyは使用したことはありますが・・・。
2020/07/01 12:28
dontdestroyの対象となるオブジェクトに、
public string LastScene = "";
というpublic変数を用意し、この変数の値を各シーンが受け取ればいけるはずです。
void Start(){
if (DontDestroyObject.getComponent<ScriptName>().LastScene == "Rouka2"){
Player.transform.position = new Vector3(8, -1, 0);
}
}
>room1から右に入り、rouka1で左から入ってこようとすると右に出てきてしまいます
初期値の問題だと思うので、例えばroom1から入るのであれば、LastSceneの初期値はroom1にすればいいのではないでしょうか?
2020/07/01 12:34
using System.Collections.Generic;
using UnityEngine;
public class rouka2kara : MonoBehaviour
{
// Start is called before the first frame update
public static string LastScene = "Rouka2";
public GameObject Player;
void Start()
{
if (LastScene == "3.tutorialroom")
{
Player.transform.position = new Vector3(-8, -2, 0);
}
else
{
Player.transform.position = new Vector3(8, -1, 0);
}
}
// Update is called once per frame
void Update()
{
}
}
2020/07/01 12:35
初期値を、room1にしました。
2020/07/01 12:52
それぞれがstatic変数を持っていても意味はないので、そういうスクリプトを用意してください。
staticに関して、どう使うのか、調べたらたくさん出てくると思うので、一度読んでみてください
https://qiita.com/szit/items/c9b14121531237785664
https://freesworder.net/unity-variable-unchange/
https://mogi0506.com/unity-switching-variable/
(リンクは一例です)
2020/07/03 01:16