※注意
- 筆者はプログラミング初心者であり、ソースコードもとても汚いです。
- 筆者の心はとても弱いです。唐突にシリーズが終わるかもしれません。
- この記事はゲームの作り方を示したものではなく、ゲーム作りにもがき苦しむ筆者の日記のようなものです。
ワールドマップからローカルマップへの切り替え
前回作った城のあるシーンとは別に城内のシーンを作ろうと思う。
作り方自体は簡単! Creat>Scene で作れる
そのシーンをFile>Building Setting 前回作ったシーンと一緒に投下
あとは、前回みたくお絵かき~。
なんか素材の切り方ミスったかな?床が壁を貫通しちゃった。
まあ、いいか。壁に当たり判定付けておいて一旦おしまい。
MapPlayerがTriggerに触れたときにSceneの切り替えができるようにしたあいなぁ。
ということで、CreateEmptyで適当なオブジェクトを作成。赤丸のところに配置してBox Collider2D で当たり判定を付け、Is Trigger にチェックをいれる。
城の当たり判定にもIs Triggerをいれておこう。
問題のスクリプトだけどTriggerにplayer触れているときに何らかのボタンを押したらSceneを移動するってやつを作りたい。
Triggerに触れているときに実行するコードは OnTriggerStay2D ってやつの中に書くらしい。OnTrigger にはいくつか種類があるらしいけど今回は OnTriggerStay2D がベストかな。
(その辺の説明はここのサイト様が丁寧かも。https://www.sejuku.net/blog/83742)
それで、今回の肝が SceneManager.LoadScene(SceneName) って関数。,
SceneName ってとこに切り替えたいシーンの名前を入れるらしい。
このスクリプトを使いまわしたいから SceneName って関数を定義していつでも変更できるようにしとくといいかも。
あとは、Find って関数でMapPlayerを見つけさせて DontDestroyOnLoad() って関数で次のシーンに MapPlayer を引き継げば完璧かな?
スクリプトはこんな感じ。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//追加
public class ChangeScenes : MonoBehaviour
{
GameObject player;
public string SceneName;//あとから切り替えるシーンを指定できるように
void Start()
{
player = GameObject.Find("MapPlayer");//シーンに存在するMapPlayerというオブジェクトを見つける
}
void Update()
{
}
private void OnTriggerStay2D(Collider2D collision)//当たり判定があるとき実行
{
if (Input.anyKeyDown)//何らかのキーが押されたとき
{
SceneManager.LoadScene(SceneName);//シーン切り替え
DontDestroyOnLoad(player);//MapPlayerを引き継がせる
}
}
これをさっき作ったIsTriggerにチェックの入ったオブジェクトに付与。
SceneNameに切り替えたいSceneの名前を入れれば完成!(ちなみに私はMap⇔Castle って切り替えをしたい)
よし、早速動かしてみよう!!
ん?MapPlayerが増えた?
元々マップにMapPlayerが存在するから引き継いだオブジェクトと2つできるのかな?
以下、問題点
- MapPlayerが2つできる
- 移動後のMapPlayerの座標がそのまま
- 城内の入り口の当たり判定が小さい
とりあえず、3だけ解決しておこう
当たり判定はEdge Radius ってのをいじると幅を持たせることができるらしい。
これで、当たり判定が広がったはず。
今回、発覚した課題の1,2に対して有効な手段を持ち合わせていないので、ここまでで終わりたいと思います。多分、プレハブ使った解決をすると思うけど、どうなるか分からん。あと、見返すとなんか英語多いなぁ。見づらかったら教えてね。以上!また今度~。