※注意
- 筆者はプログラミング初心者であり、ソースコードもとても汚いです。
- 筆者の心はとても弱いです。唐突にシリーズが終わるかもしれません。
- この記事はゲームの作り方を示したものではなく、ゲーム作りにもがき苦しむ筆者の日記のようなものです。
1.MapPlayerが2つできる
2.移動後のMapPlayerの座標がそのまま
以上2つの修正
- そもそも、プレハブとは?
- いろいろな場面で何回も使うオブジェクトとかを量産して棚にしまってるようなイメージ。(本当に合ってるかは知らん)
やり方は簡単!HierarchyにあるMapPlayerをProjectの中にぶち込めばいい。
あとは、HierarchyのMapPlayerを消しておけばOK
今回はこのEmitterを使ってMapPlayerを呼び出そうと思う。といっても、難しいことをする必要はなく、Create EmptyでGameObject を作って名前をEmitterにしておくだけ。Emitterの座標を基準に MapPlayerを呼び出すため、Emitterの座標は(0,0,0)にしておくように。
Managerという名前でEmitterにスクリプトを付与しようと思う。(変数が被りそうだから名前変えときたい。)
今回はシーン移動する前にMapPlayerを生成したい座標をChangeScene(前回作ったスクリプト)から受け取るという方法を使うので座標を細かく設定。
また、Instantiate(Object,new Vector3(x,y,z), Quaternion.identity) というコードでMapPlayerを (x,y,z)に生成させる。
この時、生成されたMapPlayer はMapPlayer(Clone)って名前になるから注意。
以下スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Manager : MonoBehaviour
{
public float Playerx;//MapPlayerのポーン地点のx座標
public float Playery;//MapPlayerのポーン地点のy座標
public GameObject ClonePlayer;
GameObject Player;
// Start is called before the first frame update
void Start()
{
Playerx = 0;//座標の初期値
Playery = 0;
}
// Update is called once per frame
void Update()
{
Player = GameObject.Find("MapPlayer(Clone)");//MapPlayer(Clone)というオブジェクトを探す
if (Player == null)//MapPlayer(Clone)というオブジェクトがなかった時、以下のコードを実行
{
Instantiate(ClonePlayer,new Vector3(Playerx,Playery,0), Quaternion.identity);//ClonePlayerを(Playerx,Playery,0)という地点にポーンさせる。
}
}
}
これを、Emitterに投下。MapPlayerのプレハブをClonePlayerに入れておこう。
前回作ったスクリプトを編集してManagerと連携できるようにしよう。
変更点
- MapPlayerではなく、Emitterを次のシーンに引き継ぎ
- manager.Playerx=StartPointx ,manager.Playery=StartPointy で次のシーンでのMapPlayerのポーン地点を指定
以下スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//追加
public class ChangeScenes : MonoBehaviour
{
GameObject Emitter;
Manager manager;
public float StartPointx;
public float StartPointy;
public string SceneName;//あとから切り替えるシーンを指定できるように
void Start()
{
Emitter = GameObject.Find("Emitter");//シーンに存在するEmitterというオブジェクトを見つける
}
void Update()
{
manager = FindObjectOfType<Manager>();//Managerというスクリプトを探す
}
private void OnTriggerStay2D(Collider2D collision)//当たり判定があるとき実行
{
if (Input.anyKeyDown)//何らかのキーが押されたとき
{
manager.Playerx = StartPointx;//ManagerにあるPlayerxという変数にStartPointxの値を引き継がせる
manager.Playery = StartPointy;//ManagerにあるPlayeryという変数にStartPointyの値を引き継がせる
SceneManager.LoadScene(SceneName);//シーン切り替え
DontDestroyOnLoad(Emitter);//Emitterを引き継がせる
}
}
}
結構変更してる気がする。
それぞれ、こんな感じで設定。
今度はどうだろうか?動かしてみよう!
うまくできた~!
これでMap編は完了って感じかな?Mapだけでも結構かかったな。後が思いやられるなぁ。
なんか、今回のスクリプト滅茶苦茶汚かった気がする。もっとうまいやり方があった気がしてならない。そろそろ、馬脚があらわれてくる頃合いです。どうぞ、ご容赦を!では、また今度~。