RPGゲームをプログラミング Part4

※注意

  • 筆者はプログラミング初心者であり、ソースコードもとても汚いです。
  • 筆者の心はとても弱いです。唐突にシリーズが終わるかもしれません。
  • この記事はゲームの作り方を示したものではなく、ゲーム作りにもがき苦しむ筆者の日記のようなものです。

今回の目標

1.MapPlayerが2つできる

2.移動後のMapPlayerの座標がそのまま

以上2つの修正



MapPlayerのプレハブ化
  • そもそも、プレハブとは?
    • いろいろな場面で何回も使うオブジェクトとかを量産して棚にしまってるようなイメージ。(本当に合ってるかは知らん)

やり方は簡単!HierarchyにあるMapPlayerをProjectの中にぶち込めばいい。

あとは、HierarchyのMapPlayerを消しておけばOK

Emitterの導入

今回はこのEmitterを使ってMapPlayerを呼び出そうと思う。といっても、難しいことをする必要はなく、Create EmptyでGameObject を作って名前をEmitterにしておくだけ。Emitterの座標を基準に MapPlayerを呼び出すため、Emitterの座標は(0,0,0)にしておくように。

Emitterに付与するスクリプト

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に入れておこう。

ChangeSceneの編集

前回作ったスクリプトを編集して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だけでも結構かかったな。後が思いやられるなぁ。

あとがき

なんか、今回のスクリプト滅茶苦茶汚かった気がする。もっとうまいやり方があった気がしてならない。そろそろ、馬脚があらわれてくる頃合いです。どうぞ、ご容赦を!では、また今度~。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク