識ログ

超絶プログラミング初心者のUnity開発備忘録

【UnityAsset】宴3を購入

今作ってるRPGの会話シーンの実装をどうしようかと調べていたら、二つほど選択肢があった。


ジョーカースクリプト(無料)
jokerscript.jp

・宴3(有料)
madnesslabo.net

たまたま宴3がセールで30%オフになっていたので衝動買いしてしまった(*´ω`*)
ちなみにアセットの購入は初めて!

宴3は公式でチュートリアルやマニュアルがしっかりしているので、使い方で困ることはなさそう。

今日からぼちぼち使ってみます(`・ω・´)ゞ

【Unity】クォータービューの実装 ①MapLoader編

クォータービューの実装に手こずったので自分用に記録。

①MapLoader.cs
このスクリプトでは背景(壁と床)の描画のみ行う。

以下スクリプトの記述

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

public class MapLoader : MonoBehaviour {

	public GameObject[] floor1; //1階の地面と壁
	//public GameObject[] floor2; //2階の地面(使う場合のみ)

	private float beginx = 0.0f; //x方向に配置し始める最初の座標
	private float beginy = 0.0f; //y方向に配置し始める最初の座標

	//1階の壁と地面のチップを決める
	public int[][] floor1_Array = new int[][]{
		new int[]{1,2,2,2,2,3,2,2,4}, //右上から左下に向かって並べていく
		new int[]{5,6,7,7,7,7,8,7,7,9}, 
		new int[]{10,5,6,7,7,7,7,8,7,7,9},
		new int[]{10,10,5,11,11,11,11,11,12,7,7,9},
		new int[]{10,10,10,13,14,14,14,14,14,14,14,14,15},
		new int[]{10,10,10,16,17,17,17,17,17,17,17,17,17},
		new int[]{18,10,10,16,17,17,17,17,17,17,17,17,17},
		new int[]{0,18,10,16,17,17,17,17,17,17,17,17,17},
		new int[]{0,0,18,16,17,17,17,17,17,17,17,17,17},
		new int[]{0,0,0,19,17,17,17,17,17,17,17,17,17},
		new int[]{0,0,0,0,20,20,20,20,20,20,17,17,20},
	};

	/*2階の地面のチップを決める(使う場合のみ)
	public int[][] floor2_Array = new int[][]{
		new int[]{0,0},
	};
	*/



	// Use this for initialization
	void Start () {

		int loop_num = 1; //ループ回数

		float rendax = beginx;
		float renday = beginy;

		//floor1とwallの描画
		foreach (int[] array in floor1_Array) {

			foreach (int s in array) {
				
				if(s !=0) //0の場合は何も描画しない
					Instantiate (floor1[s], new Vector3 (rendax, renday, 0), Quaternion.identity);
				
				rendax = rendax - 1.28f;
				renday = renday - 0.64f;
			}
				
			rendax = beginx + 1.28f * loop_num;
			renday = beginy - 0.64f * loop_num;
			loop_num++;
		}
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

マップチップのサイズは横64px縦32pxだけど、2倍の大きさにしているので1.28f, 0.64fずつ左下にずらして描画を行う。
f:id:shiki4020:20170513004844p:plain

【解決済み】Layerとかをスクリプトで変更しても反映されない?【Unity】

【問題点】

実際に表示されている画像のLayerやSortingLayerが変更されない。

 

【問題が発生した手順】

①obj_director.csでオブジェクトを生成。

 

public GameObject obj;

Instantiate(obj);

 

②obj_director.csを空のインスタンスにアタッチ

 

③そのインスペクタにプレハブをD&D(ここまで普通のアウトレット接続)

 

④obj_director.csでLayer変更、あるいはSortingLayerを変更

 

obj.layer = LayerMask.NameToLayer("aaa");

あるいは

obj.GetComponent<SpriteRenderer>().sortingLayerName = "bbb";

 

⑤実際に動かして、ヒエラルキーを確認するとLayer、SortingLayerは変わってない。

 

【原因】

以上の手順を踏んでしまうと、変更されるのはプレハブのLayer、SortingLayerであって、実際に表示されているインスタンスは変更されない。

 

【解決策】

Instantiateするとき、

 

GameObject inst = Instantiate(obj);

と新しいGameObjectを作る。

 

このinstこそがヒエラルキに表示されているインスタンスなので

inst.layer = LayerMask.NameToLayer("aaa");

あるいは

inst.GetComponent<SpriteRenderer>().sortingLayerName = "bbb";

 

とすればOK。

 

【まとめ】

プレハブでインスタンスを大量に生成するときは、必ずGameObjectに代入する。

【Unity】バーチャルパッドの実装

 

RPGアプリでバーチャルパッドを左下に設置したので、そのまとめ。

次回作作るとき用の備忘録です全て。

基本スクリプトでごり押しするスタイル。

f:id:shiki4020:20170509015841p:plain

 

基本下の4つの考え方

 ①ある範囲内でタッチし始めたら動かせる

f:id:shiki4020:20170509013709p:plain

できれば「このスティックをタッチしたら」にしたかったけど、よくわかんないのでとりあえず四角でやってる。できれば直したい。

タッチ開始位置座標が80<= x座標 <= 200, 80<= y座標<= 200なら動かせるみたいな。

 

 

②誤タッチ対策

f:id:shiki4020:20170509014129p:plain

まあ間違えてタッチする場合があるので。

タッチし始めの座標と現在の座標の距離をmagnitudeでとって、それが一定(記事書いてるときは10)以下なら、スティックを動かさない。

 

③スワイプ距離・方向と同じだけスティックを動かす

f:id:shiki4020:20170509014404p:plain

スティック位置に現在のタッチ位置を代入すると挙動がおかしくなったので、こっちの考え方で。50は半径の差。

Vector2クラスのスワイプの座標差に中央(140,140)を足してスティック位置を更新。

 

④スワイプしすぎたら枠内で止める。

f:id:shiki4020:20170509014908p:plain

Vector2クラスのスワイプの座標差に50をかけて、スワイプ距離で割った値を中央(140,140)に加算。

 

だいたいこんな感じ。

【Unity】画像リソースの色数と変換

 

 

 

自分用の備忘録として、いままで勘違いしていたUnityのRGBA16変換の話を適当な文章で。

 

(まあだいたい、ここ↓見ればわかるけど。)

 

自分で作った画像はそのままの色では使われず、必ずUnityさんに変換されてしまうので、自分はできる限り色が変わらないように使う色を選んでいる。

 

RGBA16変換がよくつかわれる変換方式とどこかで見た気がするので、それを使う前提で色を選んでいました。なんとなーく、16変換なんだから、RGBAの値を0,16,32,48...,240,255にしておけばええやろ、とおもって画像を作っていたけど、いざUnityに取り込んでみると様子がおかしい。

 

例えば、上がR255G240B240、下がR255G255B255のマップチップを読み込んでRGBA16変換を

 

すると、真っ白になってしまう。

 

つまり、

こいつが

f:id:shiki4020:20170507122337p:plain 

 

こうなってしまう。

f:id:shiki4020:20170507122424p:plain

今度は上はR255G239B239、下をそのままでやってみると 、今度ははっきりと差がわかるようになる。

なので単純に16の倍数を使えばいいというわけでもなさそう。

 

上のリンク先にも書いてあるけど

0~15,16~31,32~47,........,240~255でひとまとめになっているので、240と255は一緒のようなものだということですね。

 

少し疑問に思うのが、

240~255は全部255扱いで、上の方に揃えられる?

0~15は全部0扱いで下に揃えられる、R0G0B0なら真っ黒になってる?

じゃあ、16~31だとどこに揃えられるのでしょう?上?下?

 

まあここから(というより全部)想像なんですが、おそらく17の倍数に揃えられてるのかな?

0~15⇒0

16~31⇒17

32~47⇒34

48~63⇒51

//

224~239⇒238

240~255⇒255

だとすると、ドット絵描くときに17の倍数を積極的に使うと、RGBA16変換した時、あまりがっかりせずに済むはずなんですが、もう少し調べたほうがよさそうですね。

 

まあ見切り発車で17の倍数説を信じてリソース作ってみます。

 

【Unity】ゲームの向きと回転

File>Build Settingsからできるゲームの画面設定の話。

 

英語力がないので、いちいちチェックつけたり外したりして確認してみた

・Default Orientation

ゲームを起動したときの向き。ここをAuto Rotationにしておくと、端末の向きに応じて画面が回転する。逆にAuto Rotationにしないと、回転しなくなる。

 

・Use Animated Autorotation

回転するときにクル~っと回転するか、パッと切り替わるかの違い。

Unity Remote5を使ってると違いがわからない気がする。

しっかりビルドするとわかる。

 

・Allowed Orientations for Auto Rotation

Default OrientationでAuto Rotationを選んでるときに、どの向きへの回転を許すか。

Portrait…普通の縦持ち(iphoneの充電コネクタが下)

Portrait Upside Down…上下逆持ち(充電コネクタが上)

Landscape Right…ゲーム持ち(充電コネクタが右)

Landscape Left…ゲーム持ち(充電コネクタが左)