ぐうたら備忘録

趣味で作ったものなどをぼちぼち書いていきます。

Unityで別のシーンを読み込む

読み込みたいシーンを用意する

左上のFileから新しいシーンを作って保存。
今回はわかりやすいようにUIを適当に配置して

f:id:gootalife:20170628211333p:plainf:id:gootalife:20170628211334p:plain

としてみた。

シーンを読み込むためのスクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoad : MonoBehaviour {

    void Update () {
	if (Input.GetKeyDown (KeyCode.Space)) {
		SceneManager.LoadScene("test2");
	}
    }

}

スペースキーを押したとき、"test2"という名前のシーンを読み込む仕組みだ。

シーンを読み込む

作成したスクリプトをSceneLoadと名付けた空のオブジェクトにアタッチしていく。
(これは移動前のシーンに作成する。)

f:id:gootalife:20170628210826p:plain

できたらゲームを再生してみる。
スペースキーを押すと画面が切り替わるのがわかるはず。

最後に

これで別シーンの読み込みができるようになった。
タイトルとか曲選択とかプレイモードの切り替えに使っていくぞ~。

Unityでcsvファイルの読み込みをする

csvファイルを読み込むクラス

csvファイルはコンマで要素を区切ったファイルだから、コンマ区切りで
2次元配列に要素を格納していく。
そこでCSVReader君をお呼びした。
私の制作中の音ゲースクリプトの一部をチラ見せ。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class CSVReader : MonoBehaviour {

	public List<string[]> csvDatas = new List<string[]>();

	public void CsvRead (string musicName) {
		// csvをロード
		TextAsset csv = Resources.Load (musicName) as TextAsset;
		StringReader reader = new StringReader (csv.text);
		while (reader.Peek () > -1) {
			// ','ごとに区切って配列へ格納
			string line = reader.ReadLine ();
			csvDatas.Add (line.Split (','));
		}
        }
}

CsvRead関数に曲名を引数として持たせ、曲名のファイルを読み込ませている。
読み込む場所はResources/下だけど、

TextAsset csv = Resources.Load ("abc/" + musicName) as TextAsset;

とするとResources/abc/下で曲名のファイルを探してくれる。

読み込んでみる

ここで、さらにゲームの流れを管理しているGameManagerさんを用意する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour {

	public string musicName; // 曲名
	private CSVReader musicData = new CSVReader (); // 譜面データ

	void Start() {
		musicData.CsvRead(musicName);
	}
}

これをGameManegerと名付けたオブジェクトにアタッチしよう。
今回用意したテスト用のtest.csvはこんな感じ。

1,2,3,4
5,6,7,8
9,10,11,12
13,14,15,16

忘れずInspector上から曲名を仮入力して、シーンを再生すると~。f:id:gootalife:20170627124310p:plain

_人人人人人人人人人_
> 何も起こらない <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

そりゃそうだよ読み込んでるだけだからね。

読み込めてるか確認しよう

Debug.Logさんの出番だよ~

っということでDebug.Logで読み込めてるか確かめてみよう。

void Start() {
  musicData.CsvRead(musicName);
  for (int i = 0; i < musicData.csvDatas.Count; i++) {
	for (int j = 0; j < musicData.csvDatas[i].Length; j++) {
	  Debug.Log("csvDatas[" + i + "][" + j + "] = " + musicData.csvDatas[i][j]);
	}
  }
}

適当にforを回してみる。
f:id:gootalife:20170627124315p:plain
読み込めてるぞ~。

最後に

これでcsvファイルを2次元配列に格納する仕組みができた。
これを応用して音ゲーの譜面情報として使っていく。

次はシーンの読み込みについて書こうかな?

Unityでオブジェクトの移動をする

オブジェクトの移動

フレーム単位での移動

Unityで一番最初に書く人も多いであろうオブジェクトの移動スクリプト
x方向に動かしたい場合について考えていこうと思う。
書くとしたらこんな感じだろうか?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour {

  // 変化量
  public float dx;

    void Update() {
        // dxは任意の値
        this.transform.position += new Vector3(dx, 0, 0);
    }

}

これで毎フレーム(dx, 0, 0)の値だけ座標が加算されていく。
this.transform.positionはこのスクリプトが貼り付いてるオブジェクトの
座標(x, y, z)のこと。そこに変化量を加えていく感じ。

Update関数はフレーム毎更新だからFPS(1秒毎の画面の更新回数)の値次第で移動速度が変わって見えてしまう!
つまり処理が遅いと遅く移動しているように見える。処理が早いときはその逆。
できれば等速直線運動してほしいよね~?って人は次の項目へ。

時間単位での移動

等速直線運動の式は距離x、速さv、時間tとするとき
x = v * t
が成り立ってるのは既知だと思われる。
のしたのげおや、って覚えたよね?)

これをスクリプトにしたいとき、
x = オブジェクトの位置
v = 任意の速度
t = 経過時間
を設定してあげればいいな~ってことで

書こう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour {
  
  // 変化量
  public float dx;

    void Update() {
        // dxは任意の値
        this.transform.position += new Vector3(dx * Time.deltaTime, 0, 0);
    }

}

Time.deltaTimeは1フレーム前からの経過時間を表してくれているから
変化量 * 時間の形にすることができた。
これで時間単位で移動してくれるようになる。

変化量dxの変更

変化量dxはpublicな変数だから、Inspector上からも数値を代入できる。
Moveスクリプトに表示されているdxに任意の値を入力したらそれが変化量になる。
f:id:gootalife:20170625183015p:plain

動かしてみる

動かしたいオブジェクトに作ったMoveスクリプトD&Dしてdxを入力したら再生してみる。
f:id:gootalife:20170625183448g:plain
ちゃんとx方向に動いてるぞ~。

最後に

今回は基本的な部分に触れたけど、これを組み合わせれば
音ゲーのノーツが移動する動きを表現できるし使うことは多々ありそう。

次はファイルの読み込みについて書こうかな~?

なんかブログ始めてみた(適当)

ブログとかやったことが無いから書き方がわからん!
色々調べた結果、ソースコード
>|言語名|と||<で囲んで記述すれば下のようになることがわかった。

お馴染みのハローワールド
#include <stdio.h>

int main(void){
    printf("Hello World!!\n");
  return 0;
}

シンタックスハイライトまで付いてくれるなんてすごいな~(小並感)
画像の挿入も簡単そうだし、試しに今Unityで作ってる音ゲーのゲーム画面でも貼ってみる。
タイトルは「BeatCluster」。

f:id:gootalife:20170625020127p:plain

チュウ○ズムじゃないです。
作り始めた頃から記事書いてれば遡って書く必要もなかったのになあと思いつつ、
せっかくだし記事に残して形にしたいな~とか。

なんで音ゲー

数あるゲームのジャンルの中で音ゲーを選択した理由

  • 人間みたいな3Dモデルがなくて楽!
  • モーション書かなくていいから楽!
  • ストーリーがないから楽!
  • 音ゲーが好き(そんなに上手くはない)

思い浮かぶのがこれくらいかな~
楽っていうのは個人で作るって意味だからね勘違い✖!

やっていくこと

  • 躓いたところとその解決策
  • 実装したいことのメモ
  • etc

同じようなことで躓いてる人が検索してヒットしてこのブログ見てくれたらいいなー
ぐらいの気持ちで書いていこうかな。

Unity楽しいよUnity