UnityでRPGの建物出入り的なのを作りたい。
簡単に言えば、町のシーンから家に入って、家を出ると家の出口に居るみたいな。
完全に個人での開発になるので、参考になるかは不明ですが。
(動画内では2階に上がってますが、あれはTrasform。Positionで遠くに置いてる二階に飛ばしてるだけです。この記事を読み終えれば恐らく出来ると思います。)
まず、今回作る仕組みについて。
Unityは比較的変数の入れ替え・受け渡しが簡単なので、変数でどのsceneから移ってきたかを判別させます。
まずスタート画面。(以下はスクリプト、そのままコピーできるかと思います。)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class startOP : MonoBehaviour {
public static int Cscene1 = 0;
public void OnClick(){
SceneManager.LoadScene ("Scene1");
}
}
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class startOP : MonoBehaviour {
public static int Cscene1 = 0;
public void OnClick(){
SceneManager.LoadScene ("Scene1");
}
}
初歩的な事では有りますが、public classの後は、プログラムのファイル名「~~~~.CS」の~~~~を入れてください。
まずこのシーンで、町のステージになるScene1用のどこのシーンから来たか判別するための変数を作ります。
Public staticとする事で、どこからでもこの変数を書き換えやアクセスが出来るようになります。
今回は「Cscene1」としましたが、ご自分の管理しやすいように名前は変えてください。
とりあえずで「0」を入れておきます。
で最初は普通にscene1のキャラクター初期位置になります。
続いてscene1(以下、スクリプト)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PositionScene1 : MonoBehaviour {
public GameObject Player;
// Use this for initialization
void Start () {
int x = startOP.Cscene1;
Debug.Log(x);
if (x == 1) {
Player.transform.position = new Vector3 (0, 10, -30);
Player.transform.rotation = Quaternion.Euler (0, -160, 0);
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class PositionScene1 : MonoBehaviour {
public GameObject Player;
// Use this for initialization
void Start () {
int x = startOP.Cscene1;
Debug.Log(x);
if (x == 1) {
Player.transform.position = new Vector3 (0, 10, -30);
Player.transform.rotation = Quaternion.Euler (0, -160, 0);
}
}
}
こちらもclass名はお好きなように。
このプログラムはscene1にCreate Emptyで作った箱に設定しておきます。
まずpublic GameObjectでプレイヤーキャラを指定する枠を作ります。
そこにscene1のInspectorでプレイヤーになるものを設定します。
(タグから自動で設定も出来なくはないが、プレイヤーは基本一つなので今回はこれで。)
まず、sceneが始まった時に、void Startで先程作った変数を取得します。
Debug.Logはプレビューで動作の確認用。
最初にこのscene1を読み込んだ時点では変数は「0」なので、特に何もなくプレイヤーは配置したとこから。
町の中から建物に入ります。
建物に入るスクリプトは以下のように。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Scene1inTATEMONO : MonoBehaviour {
void OnTriggerEnter(Collider hit){
if (hit.CompareTag ("Player")) {
SceneManager.LoadScene ("SceneTATEMONO1");
}
}
}
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Scene1inTATEMONO : MonoBehaviour {
void OnTriggerEnter(Collider hit){
if (hit.CompareTag ("Player")) {
SceneManager.LoadScene ("SceneTATEMONO1");
}
}
}
建物入り口に後は当たり判定を置き、そこにTagでPlayerが付いたものがぶつかると、scene移動で建物内に入ります。
入り口用の当たり判定は、「Is Trigger」にチェックを入れておいてください。
さてここからが本題。建物から出たときに、先程のscene1でスタート地点ではなく建物入り口前に出るようにします。
建物出口のプログラムは以下。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Scene1outTATEMONO : MonoBehaviour {
void OnTriggerEnter(Collider hit){
if (hit.CompareTag ("Player")) {
startOP.Cscene1 = 1;
SceneManager.LoadScene ("Scene1");
}
}
}
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Scene1outTATEMONO : MonoBehaviour {
void OnTriggerEnter(Collider hit){
if (hit.CompareTag ("Player")) {
startOP.Cscene1 = 1;
SceneManager.LoadScene ("Scene1");
}
}
}
ここで、最初に作った変数に1を入れます。
それ以外は入る時のプログラム・当たり判定と一緒です。
改めて、scene1のプログラムを見てみましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PositionScene1 : MonoBehaviour {
public GameObject Player;
// Use this for initialization
void Start () {
int x = startOP.Cscene1;
Debug.Log(x);
if (x == 1) {
Player.transform.position = new Vector3 (0, 10, -30);
Player.transform.rotation = Quaternion.Euler (0, -160, 0);
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class PositionScene1 : MonoBehaviour {
public GameObject Player;
// Use this for initialization
void Start () {
int x = startOP.Cscene1;
Debug.Log(x);
if (x == 1) {
Player.transform.position = new Vector3 (0, 10, -30);
Player.transform.rotation = Quaternion.Euler (0, -160, 0);
}
}
}
先程は最初に作成した変数に「0」が入っていたのでif文以下の処理は行われていませんでしたが、今回は「1」が入っています。
1が入っている場合、
Player.transform.position = new Vector3 (0, 10, -30);
Player.transform.rotation = Quaternion.Euler (0, -160, 0);
Player.transform.rotation = Quaternion.Euler (0, -160, 0);
Playerの枠に設定されたもの、今回はプレイヤーキャラが、この場所に自動で置かれます。
まず上の文が、絶対座標での位置。カッコ内は、x、y、zの位置です。
今回は建物入り口前。
ついでに、建物が回転しているので、その向きに合わせてキャラクターを回転させます。
これもカッコ内はx、y、zです。
両カッコ内は、物の位置に合わせて置いてください。
(多分入り口の位置を取得して、そこから+幾つとかも出来るのですが、今回は割愛)
これで、建物に入ったり出たりの完成です!
今回のシステム、他にも利用法は幾つかあります。
イベント的なシーンで変数を入れ替えて、物の配置を一気に変更したり、建物の出口を別の世界にしたり。
使い方は、色々と今後も紹介できると思います。
さて今回の方法、完全にkou0128の独自方法なので、恐らくもっと簡単な方法も有るかと思います。
少しでもゲーム開発の役に立てばと思います。
案外個人開発で困るのが、情報集めだったりするので、今後はこうして作ったプログラムの紹介をしていきます。
それでは、最後まで読んで頂きありがとうございました。