7月に戻ります。

社会人だからね

出張に行ってまいります。出張というより、研修。2ヶ月間。7月に戻ります。6月に公開とか笑えるwwww 今年中に公開できるといいな。

会話表示→イベント分岐まで行きたかったので、とりあえず目標は達成かな。(大嘘)このスピードで製造していたら、この仕事で食べていくのは無理だよねー。

ま、なんだ。使いまわせるやつだからやっておけば、後は楽なはず。と言い聞かせています。

MonoBehaviourさんはNewさせない。

とりあえず進捗

①既存ゲームファイルがない場合「続ける」ボタンを非活性かする

②newゲームボタンで、所定の画面へ線維

③それなりの会話を表示させる。

ここまで動けば割と楽しいですね。このペースで進めばまぁ、なんとか終わるだろう。ただし、ストーリーがない。追いついていない。そしてイメージファイルもない。作らなければ。今年中に公開したいな・・・。

どんどん伸びているけど、気にしない。趣味だし。嫌いになるよりはだらだらやりますお。

unityはオブジェクトにスクリプトをつけるのよ

というのが、基本の考えだそう。

ふーんそうなんだというくらいしか考えていなかったけど、一番はじめにUnityでC#やっていた時に詰まったので、記事にしておきましょう。

さて、以下はCSVを呼び出すクラスです。なんども書いているので、説明は割愛。

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

public class CsvReader : MonoBehaviour {


	//読み込むCSVファイル
	private TextAsset csvFile;
	//表示用シナリオ(退避用CSV)
	private List<string[]> scenarioList = new List<string[]>();
	//シナリオ行数カウンタ
	private int csvCount = 0;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	public List<string[]> CsvRead (string scenarioName){

		csvCount = 0;

		csvFile = Resources.Load ("Scenarios/" + scenarioName) as TextAsset;
		StringReader reader = new StringReader (csvFile.text);

		//csvファイルを取得
		while (reader.Peek () > -1) {
			string line = reader.ReadLine ();
			scenarioList.Add (line.Split (','));

			csvCount++;
		}

		return scenarioList;
	}

}

そして、メインのオブジェクト(今回はCanvas)には、このシーンを制御する、「NewGameController.cs」がいらっしゃいます。
この中で、CsvReader.csを使いたい。ね。普通の考え方だよね。

で、ここでネックになるのが、「Unityさんはオブジェクトにスクリプトコンポーネントをつけて使用する」ということ。

作成したスクリプトは、まず、どれかしらのオブジェクトにつけておく必要があります。
裏方さんでいらっしゃっても、必要。

裏方さんもメインのスクリプトさんと一緒にいた方が楽なので、同じオブジェクトにつけます。できるだけね。

私は基本、主なスクリプトはCanvasに集めています。

空のゲームオブジェクトにスクリプト集めている方もいらっしゃいましたね。それはそれで見やすいね。

んで、以下はメインさん。

public class NewGameController : MonoBehaviour {

	//シナリオCSV取得クラス
	private CsvReader csvReader;

	// Use this for initialization
	void Start () {
		csvReader = new CsvReader();
	}
}

一見、普通のC#クラスだと考えれば、普通です。行けそうです。
しかし、MonoBehaviourクラスでは、怒ります。

以下がエラー内容。

You are trying to create a MonoBehaviour using the ‘new’ keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()
CsvReader:.ctor() (at Assets/PlugIns/CsvReader.cs:14)
NewGameController:Start() (at Assets/Scripts/NewGameController.cs:24)

簡単にいうと、Newキーワード許さねーぞ。componentから取得しやがれ。ということ。
上記を回避するためには、以下の通り、Newではなく、オブジェクトに付いているスクリプトコンポーネントを見つけて来るようにさせます。

以下の通り。

public class NewGameController : MonoBehaviour {

	//シナリオCSV取得クラス
	private CsvReader csvReader;

	// Use this for initialization
	void Start () {
		csvReader = GetComponent<CsvReader> ();
	}
}

この場合は、同じオブジェクトに付いている、を見つけに行っています。
別のオブジェクトのものをGetすることももちろん可能。

個人的には、あまり好きじゃないのでこっちにする。

UnityでCSVを読み込む

ソース残していないべ

かなり前、CSVを読んで配列に格納するスクリプトを作成しておりました。

Unity CSVを読み込んでシナリオを書き出す

ので、それ読み込めばすぐ終わるわ(笑)としていたら、削除していましたね。

多分ね。去年というか今年の初めにMacさんの調子がすごぶるよくなくて色々片付けしていた時に、不要だと削除したんだわ。

その時パッケージエクスポートしていないから何も残っていなくてま、再作成。

ついでなので、ここにもソース乗せておく。

パッケージ化したいので、別プロジェクトでサクッと作ります。

事前準備

①テスト用CSV:今回は4行2列のものを準備。

Assetsに「Resources」フォルダを作成、さらにわかりやすくするため、そのフォルダの下位フォルダ「Scenario」の中にCSVをインポートしておきます。

②CSVを読み込むアクションが必要なのでボタンを配置

③CSVを読むスクリプト「CsvReader」をキャンバスUIをつける。

ソース

面倒臭いので、そのまま載せる。なお、c#です。

using UnityEngine;
using System.IO;

public class CsvReader : MonoBehaviour {


	//読み込むCSVファイル
	private TextAsset csvFile;
	//表示用シナリオ(退避用CSV)
	private List<string[]> scenarioList = new List<string[]>();
	//シナリオ行数カウンタ
	private int csvCount = 0;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	public void CsvRead (string scenarioName){

		csvCount = 0;

		csvFile = Resources.Load ("Scenarios/" + scenarioName) as TextAsset;
		StringReader reader = new StringReader (csvFile.text);

		//csvファイルを取得
		while (reader.Peek () > -1) {
			string line = reader.ReadLine ();
			scenarioList.Add (line.Split (','));

			Debug.Log (scenarioList [csvCount] [0] + "," + scenarioList [csvCount] [1]);

			csvCount++;
		}

	}
}

動きはDebug.logで確認するため、入れています。

ま、これでおっけ。その後は、ボタンの「On Click」時の動きを設定してあげる。

シナリオ名前を変えて読み込みたいので、引数で渡しています。

この類の処理に関する詳しい解説を乗せているサイト様は山ほどあるので、これはあくまで私の備忘として説明は割愛。

ボタンを押すと、Debugを吐き出します。

ついでにパッケージエクスポート

パッケージをエクスポートしよう。

ここにある。以上。

いつも思うのだが

Unityで初めてプログラミングを全くやったことない人が、これでプログラミング覚えるのはあまり良くない気がする。

知っている人だからこそのやり方があると思うのだけど、

例えば、Unityはボタンにスクリプトをつけるという前提なので、クラスを作ってNewしようとすると怒る。それ、許さないって怒られる。

別の言語でプログラミングやる方はお分かりでしょうが、クラスNewできないんだふーんってなるじゃん?

逆のバターンで、クラスをNewしようとする発想がない人がやるとちょっとなと思って。いや、偏見と先入観かもしれないけど。

シーンを分けることを考える

シーンの分け方のルール決めよう

割と、シーンの分け方に甘かったかな。

今回のアプリは1つのシーンのほぼほぼ集約するつもりだったんだけど、

弱一ヶ月半ぶりに開いてみて(ついでに3.3にupしてみて)、

このシーンの分け方だと、非常にまどろっこしいことに気づいた。

簡単に言えば、スパゲッティ化する。

なるほど、シーンを分けることは、こういうことがと気づくことができましたのね。

・・・日にち開けてプロジェクト開いてみるのは良い経験だよね。不本意だけど。

ここで、Qiitaを漁って良い記事を見つけました。

・[Unity] Sceneの役割や使い方をざっくりまとめた

https://qiita.com/lycoris102/items/bf0a9ec4a653b4dd97b9

改めて考え直すととても役に立つ良い記事。

プログラム自体は割とわかりやすくかけていたので(褒めよう過去の私)、あとは保守面を考えて、シーンを分けようと思います。

会社行くまであと3週間ほど、それまでにゲーム性のところ完成しよう。

明日の目標は、ゲーム開始シーンの完成。

必要なのは

①ゲーム初めての判定
②会話用の見栄え
③ CSV読み込み
④自分情報の初期設定
⑤トップ画面を表示する ←これはもうあるので、表示するだけ。

できるレベルの目標を決めてやらないと、ダラダラになりそう。

同じ動きなら、Animatorは一つで大丈夫

Unity始めた時は、わからんかった

なに当たり前なこと言ってんだよってことかもしれませんけど。

私は知らなかったの!知ったのはほんの、一個前のアプリ作った時でした。

つまり、Prefubすごいってこと。アニメーターもまとめてプレハブ化できるー。

こんな感じのパネルがあるとしましょう。

こんな感じで動く。今は「Info」だけにしている。

で、同じ大きさのオブジェクト(ま、パネルですけど)を後3つ、作る。ShopとかSmsとかね。

初心者の私は、それぞれのパネルにAnimatorをそれぞれ作り(つまり4つ)、それぞれを動かしていました。

無駄だね!だって「Info」パネルを作って、Animatorまでつけた状態でPrefubしちゃえば良かったもんね。

スクリプトで区別してやれば良いだけの話。

Prefub化したInfoから、もう一つ作成してやる。

スクリプトは、ボタンを利用するところにつけてます。そこにPublicでAnimatorを設定させる。すると、できちゃう。

ねー。

Animator同じやつめっちゃ作ってたんだよねー。しかもその状態で公開したんだよね(一番初期のやつ)。

2個目のアプリの方が、色々と突っ込んでいるわりには軽いのですが、その理由の一つはこういう余計なものが集約されたからだと思うのね。

恥さらしということで、公開。

Unity パネルを開く

パネル表示しよう

真ん中の黄色い矢印のボタンは「ComputerButton」これをクリックすると「GamePanel」が現れます。

ということで、これがトップ画面。右のパネルのど真ん中にあるイメージ(ボタンコンポーネントつき)をクリックすると、左の子が表示されます。

アプリを稼働させると、こんな感じ。

Triggerが一般的かしら

初期状態 →  ボタンをクリックして、オープン → オープンした状態 (作ってはおいたけど、実装はしていない「クローズ」

ここの説明のブロガーさんは山ほどあるので、説明スキップ。

作成したTriggerは「Open」「Close」の二つ。どんな動きなのかは、名前のとおり。

Triggerをスクリップで設定する。

これもいっぱいあるけど、一応。

スクリプト名は「SubPanelControl.cs」c#です。

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

public class SubPanelControl : MonoBehaviour {

	public Animator PanelAnim;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	public void OpenPanel(){
		PanelAnim.SetTrigger ("Open");
	}
}

上記スクリプトは「GamePanel」につけています。動かしたいのは、このパネルだから。

AnimatorをPublicにしているので、スクリプトのところで、アニメーションをつけている、己を設定してあげる。

で、これを呼び出すボタンは、こう。

On Click()時に呼び出すのは、「GamePanel」なので、引っ張って設定。「GamePanel」に設定されている、スクリプト「SubPanelControl.cs」の「OpenPanel」関数を設定。

これで終了。

スクリプトなしでTriggerを稼働させる

この記事が、見つからなかったので書く。もっと探せばあるとは思いますけど、やっぱりスクリプトを作成してやるのが主流なのでしょうね。

やり方は簡単。

今回、TriggerさんはString型なので、それを選択し、Triggerを設定すれば良い。

完結な動きをするなら、スクリプトを作成して動かすメリットはないでしょうね。これでいいじゃん。Unityさんが楽にしてくれたし。

ただ、ボタン押してから数秒後に開きたい、もしくは他のパネルやらボタンを推せなくするとか、「アニメーション動かす以外」を混ぜ込みたかっただ、どうしてもスクリプトが必要になる。

全くの余談

椿さんのツイッターで、これすごいって思っていたUnity2017.3の機能。

ズームできる!!!

感動した。ものすごく便利。

Unity Canvas Scalerについて

個人的な設定

そういえば、Unity最初に触った時に、特に何も考えていなくて痛い目を見たのが、CanvasScalerでした。

私の場合は今のところAndroid端末した開発していませんが、ご参考までと、私の設定を記事にします。

今は流れるかのようにこの設定をしてしまうのですが、久しぶりに開いてあ、そういえばと思ったので。

Scale With Screen Sizeで固定

初期で開くと、この状態。

・Unityマニュアル:Constant Pixel Size
・リンク:https://docs.unity3d.com/ja/540/Manual/script-CanvasScaler.html

マニュアルによれば、「UI 要素をスクリーンサイズによらずピクセル単位で同様のサイズに保ちます。」となっています。

なるほど、わからん。

ちょっと記憶が曖昧ですが、これを設定して実機テストをした時に、UIがはみ出る、切れるなどがありました。

画面サイズに合わせて、UIの要素を替える必要があるということかしら、となって「Scale With Screen Size」にしたところ、これがビンゴ。

で、Reference Resolutionとは、「スプライトがこの ‘Pixels Per Unit’ 設定を有していれば、スプライトの 1 ピクセルは UI 内での 1 ユニットをカバーします。」となっています。

なるほど、わからん。

私の認識なので、あくまで参考。

このキャンバスの画像度を設定しているようなものだと思っています。作ろうとしているのは、Android端末のアスペクト比  16:10のもの。ということで、画像度は1920×1200に設定。

で、今、MatchをHeightにしているのですが、高さに合わせて調整して欲しいから。(横に合わせたかったら、Width)

上で一個ボタンを配置していたので、MatchをWidth⇄Heightして見ましょう。

という状態になります。

Canvas Scalerは初期で設定しておかないと大変

私は基本的に以下のように設定します。

・UI Scale Mode : Scale With Screen Size
・Constant Pixel Size : Reference Pixels Per Unit
・Reference Resolution :
アスペクト比が10:16 → 1200 x 1920
アスペクト比が16:10 → 1920 x 1200
・Match :
アスペクト比が10:16 → Width
アスペクト比が16:10 → Heigth

画像度は、高ければ画像もそれなりの画像度を揃えないといけないということです。ま、スマホでみる分はわからないとは思いますけどね。

これが、初期で設定を忘れてUI配置終わってから気づいたとしましょう。

惨事です。

設定変えて全てのUIが移動するのが見えますよ。まだ地道に修正してやらないといけないんで、シーン作成時に必ず初期で済ましています。

Android端末のバックボタンでアプリを終了する。

iOSとは関係のないお話

Android端末の「戻る(Back)」ボタンでアプリを終了させるのは、多分普通のお話。

しかし、私が作っていた3つのアプリは、どれも終了してくれません。

何故なら、実装していないから

何故実装していないかというと!テストしていないから!わからなかったの!!

先日何も考えず自分のアプリつけてバッグボタンで終了させようとしたら、終了したしない!私のお古いiPhoneさんは、戻るで終了してくれました。

ということで、ググる。

以下の記事を発見。

・記事:UnityでのAndroidバックボタン対応
・リンク:https://qiita.com/WassyPG/items/12030494688cba02ce1b

そうか!対応が必要だ!

実機じゃないとわからん

ということで、めちゃめちゃ簡単かつわかりやすく説明いただいているので、ここではソースは割愛。

リンクかけていますので、元記事よりご確認願います。

で、やってみよう。

※Unity 2017.3 of 3で実施

あ、スクリプト名「buootn」なってる。ま、いいか。

とにかく、打ち込んで見たら、ランタイムプラットフォーム判定用のあれが出ますね。なるほどねー。

	if (Input.GetKeyDown (KeyCode.Escape)) {
		Application.Quit ();
		return;
	}

とにかくAndroidプラットフォームの判定を消して(テストしたいんで)稼働させてみる。

※静止画じゃないです。Gifです。
※Macで「Esc」押しています。

これはつまり、実機じゃないとわからんと。

うむ。そうね。テスト保留。これだけのために実機繋ぐにはちょっと設定面倒臭すぎる!

そしてこうやってバグを仕込むのでしょう。

テストは大事けどね。流石に無駄たと思うのです。

実際に実機テストするレベルでやって見ますか。

パッケージ一覧を作成した

一つ作っておけば、別のアプリでもただインポートするだけで使えるようにしたい。ということで一覧を作成しましたの。

有難やGoogleさま。

というか、どんどんお仕事やっているように見えて悲しい。

Google様さま

スプレッドシート偉大過ぎ

ある程度作りたいゲームを固めたので、画面一覧概要を作ってみました。

Google本当、すごすぎ。このクラウド5Gまで無料。個人なので、余裕。素敵。

なんでしょう。数年におよぶ社畜生活のせいか、ここまでやっておけば、なんか進めそうな気がしますね。

やっぱ、きっちきちに締め付けないといけないのかしら。飽きるとやべーって思ったんですけど、飽きないうちに全部決めておいて、飽きててもとりあえずやれば(完全作業だけど)できる形のほうが向いているかもしれません。

で、極力横にそれるような機能をそぎ落としたんですが、それでもシーン分けするだけで、ざっと10を超えました。

おーっと。うむ。あと5か月。頑張る。

絵とかもろもろそろえると考えると、製造だけで純粋にかけられるのは、正直3か月かな?(笑)

お友たちにヘルプは要請するつもりですけどね!

あとは、パッケージ化して合体していく感じで。

明日が会社という地獄が待っておりますので、いやーもう。本当。宝くじあたらない・・・。

新年の目標(という見直し)

5秒の法則

日本では翻訳発売されていないんですが、メル・ロビンスさんの「5秒の法則(ルール)」という本をご存知でしょうか。

※ブロガーさんのまとめ見つけた:
「やる気は5秒で死んでしまう」 行動のブレーキを外すための”自分ルール”のつくりかた

あんまり、この手のビジネス参考書みたいなものは好きじゃないのですが、初めてこれは!と思いました。

要は、「やらないといけないことがわかっているのに、面倒臭く、言い訳を考えていようとしているとき、5、4、3、2、1とカウントダウンを行いとりあえず体を動かす」。

人によって違うと思うのですが、私には有効でした。

・・・どうだろう、秒単位でスケジュールで締め付けられている日本人は向いてるのでは(泣)

目標の見直し(という言い訳)

今まで作っていたものは、飽きると思って「こういうものが作りたいな」と思って、作り始めたものでした。

難しくないし、できるものだと、今も思っているのですがおそらく1年は必要になるのかと。風呂敷を広げすぎて、やらなければいけないものが多すぎました。

というのを年末計算してみた(笑)。

5月で公開できるものにチェインジ。

①機能ごとにパッケージ化して、後で別のアプリに使えるようにする

→部分部分でパッケージ化することができることを知ったのが、つい先先月。

パッケージ化するものも洗い出す。

②風呂敷は広げすぎない。

③ゲーム性は極めて単純に。パズルゲームレベルで。

④人物絵以外は、極力、著作権フリーの素材で賄う。

結構細かいところまで詰めてから、アプリの製作に入ろうと思っています。前回の失敗は、飽きるを想定してだらだらやったのもあった。

今回は割とスケジュール真っ当に組んでやってみようかと。

・・・社畜の成分が消えない。

そして社会人辛い。

来週月曜日までには、どんなアプリにするかガッチガチに決めておきます。

1 / 6ページ

© Copyright 2017 「It Happens」 All rights reserved.