企画にゲームが作れるか?

ゲームのモックを作るために知ったあれこれをまとめるところ。企画屋のため技術レベルは低めです。

表編:Arbor3のすすめ 裏編:ギルド内での軽率質問のすすめ

はじめに

本記事は
Unityゲーム開発者ギルド Advent Calendar 2020 - Adventar
12/10 の記事です。

軽率に登録したものの「記事かく場所ないじゃん!」と、
過去のあれやこれやをさばくった結果、
大昔に登録だけしてろくに使っていなかったブログを見つけたので、ここに投稿します。

読んでタメになりそうな人

  • プログラム専門外の方
  • ググった記事を参考にして、単一の挙動は作れる人
  • でも、たくさんの挙動をどうまとめて書いたらいいか困っている人

概要

自語りではありますが、私の技量はこのくらいです。

○Update()の中に、移動コマンドを作ることはできる

    void Update()
    {
        //何かいい感じに移動するコマンド
        CharacterMove(hogehogehogehoge);
    }

○移動させたくない時があるので、分岐で通らなくすることはできる

    void Update()
    {
        //止まらなくていい時
        if(!isStop)
        {
            //何かいい感じに移動するコマンド
            CharacterMove(hogehogehogehoge);
        }
    }

ここまではググって見つけたコードを参考に作れる。
ただし、この先はどうだろう?

  • 攻撃中は移動できない(分岐を増やせばいけそう)
  • ポーズメニュー中は移動できない(まだいける?)
  • タイトル画面中は移動できるようにする(分岐増えてきてつらそう)

もっともっと分岐が増えてきて、
Updateで分岐ゴリ押しができなくなる未来が見えています。
ですが、中々事例を検索しても、いい感じに処理できず困っていました。

こんな状況を解決できそうな(実践中のため、できそう)ツールとして、
Arbor3arbor.caitsithware.comを紹介するのが、本記事の本題です。

Arbor3で、毎フレーム回したい処理をかんたんに分離できる

これです。この記事では、この1点だけをピックアップします。

使い方は公式ドキュメントを見たほうがいいので省略しますが、

Arbor3の機能を経由して作られるスクリプトStateBehaviourScriptには、
作成時点で、それぞれのステートにいる時だけのUpdate()が用意されています。
そこに愚直に挙動のコードを書くだけで、
前述の挙動のONOFFをするためだけの分岐を書かなくて良くなるのがとても凄いです。

	// OnStateUpdate is called once per frame
	public override void OnStateUpdate() {
		//自機の移動処理に関しては、全てここに書くだけ

		//何かいい感じに移動するコマンド
		CharacterMove(hogehogehogehoge);

		//キー入力次第で、次の攻撃ステートに移行できるようにする
		if (Input.GetButtonDown("Attack"))
		{
			Transition(nextAttackState);
		}
	}

これくらいなら書ける!

移動用のステートで使うスクリプトにはこれだけ書けばよく、
攻撃用のステートには攻撃用のスクリプトだけ書けば良い、

もう最高ですね。これがやりたかった。
Update()にif分岐ゴリゴリで処理を書きまくっているご同輩がもしいたら、
ぜひとも導入を検討してみてください。

UnityStationでも紹介されていました

www.youtube.com
最近のUnityStationでもArbor3回がありました。
もっとわかりやすく紹介しているので、
見てみると使いたくなってくるかもしれません。

本記事の内容は、以上になります

本記事で紹介したかった内容は以上です。ありがとうございました!
明日以降もアドベントカレンダーをお楽しみください。

続きを読む

スプレッドシートの編集をトリガーにGoogle App Scriptを実行する

前置き

スクリプトの作成とテスト実行までの手順はこちらに記載しました。
himitsukichilv2.hatenablog.com

今回は、スプレッドシートのセルに変更があったときにスクリプトを起動する手順を記載します。

トリガーを設定する

何か条件を満たしたときにスクリプトを走らせる仕組みを、トリガーと呼んでいるようです。
このトリガーの機能を用います。

GASの画面で編集->現在のプロジェクトのトリガー
f:id:wataseshiu:20200215153317p:plain

開いたページで「トリガーの追加」を選択
f:id:wataseshiu:20200215153604p:plain

トリガーの設定を行う画面が出てきます。
タイムスケジュールに沿って実行もできるようですが、
今回はセルの値が変わったときにスクリプトを実行したいので、
設定を画像のとおりにします。
・「イベントのソースを選択」を「スプレッドシートから」
・「イベントの種類を選択」を「編集時」
f:id:wataseshiu:20200215153736p:plain

この状態で追加をしたら設定完了です。

動作確認

スプレッドシート上のどこかのセルの値を変更すると、
スクリプトが走り、メッセージボックスが表示されるようになります。
f:id:wataseshiu:20200215154407g:plain

おわりに

サンプルで実行しているスクリプトがメッセージボックスのため、
セルを更新する度に制御が奪われる不便なものが出来上がることになりました。

この先は、スクリプトの中身を変えることで、
用途にあった挙動を取らせることが必要となります。
次項から、「任意のセルを更新したかをチェック」し、
「変更のあったセルが任意の値になったかをチェックする」ことで、
特定条件のときだけ処理を走らせる構造を作っていきます。

Google App Scriptをスプレッドシートから呼べるようにする

前置き

スプレッドシートとSlackの連携について書き始めたところ、
そもそものスクリプトを呼ぶまでの手順が長かったので、そこまでで分割しました。

スプレッドシートの用意

何はともあれ、スプレッドシートを作ります。
f:id:wataseshiu:20200215150015p:plain

Google App Scriptの用意

ツール->スクリプトエディタ を実行で、
とりあえずスクリプトが作成されます。
f:id:wataseshiu:20200215150605g:plain

スクリプトのテストコードを書く

動作確認だけしたいので、メッセージボックスの表示だけのコードを用意しました。
スクリプトを実行すると、スプレッドシートの画面にメッセージボックスが表示されるようになります。

function myFunction() {
  Browser.msgBox("スクリプト実行", Browser.Buttons.OK);
}

スクリプトの起動テスト

実行ボタンを押すとスクリプトを実行できます。
f:id:wataseshiu:20200215152605p:plain

初めてスクリプトを実行したときは、こちらのような確認画面が出ます。
許可をしてください。アカウントの指定も済ませてください。
f:id:wataseshiu:20200215151055p:plain

こんなの出るんですね。恐れず詳細を押して、安全でないページへ進みます。
f:id:wataseshiu:20200215151327p:plain

最終的には、スプレッドシートのタブに戻ると、
スクリプトで記述した、メッセージボックスが表示されていると思います。
これでスクリプトの実行確認は完了です。
f:id:wataseshiu:20200215151714p:plain

Unityでノベルゲーっぽいテキスト表示機能を作る3(文字列を表示させる)

前回とりあえずstring変数を作ることが出来たので、とりあえず画面に表示させます。

▼使うもの

  -NGUI (無料になった2.7を使っています)

スクリプトからLabelにテキストを表示させる

public UILabel label;
string textData;

label.text = textData;
UILabel

NGUIのLabelの型になります(たぶん)

UILabel.text = "hogehoge";

Labelで表示するテキストはこの.text変数を変更することで変えられるようです。

あとはNGUIの基本操作を行って画面上にラベルを作成し、
作成したラベルをInspectorでアタッチしたら完成です。

f:id:wataseshiu:20140409233335j:plain
これでひとまずテキストファイルのデータをUnity上で表示させることができました。
この先は自分に必要な機能を使いやすいように分かる範囲で追加していく事になります。

▼おわり

次はいま「AAA,欲しいテキストデータ,CCC」となっているstringの中から、
欲しいテキストデータだけを抜き出して扱えるようにします。
やることは前回のSplitをまた使うだけです。
ようやく余分なものの無いテキストを表示させることが出来るようになります。

はてなブログでコードを綺麗に記載する機能(シンタックスハイライト)を使うための設定

class HogeClass{
  int hogehoge;

  //コメントもOK
  void HogeFunction(int value){
     hogehoge = value;
  }
}


こちらでシンタックスハイライトの使い方が紹介されています。

ただしこれに沿っただけでは上手く表示されませんでした。
ブログ開設直後の状態では、はてな記法(?)が使えない事が原因でした。
シンタックスハイライトの機能を使うのに必要なものらしいです。

はてなブログ記法を使えるようにする設定方法

 -ブログの設定ページを開く
 -編集モードを選択する箇所があるので、そこではてな記法モードを選択する

これだけです。
すると記事のはじめのようにコードを勝手にいい感じに表示してくれます。
(インデントがどこにあるのか分からない…とりあえず半角スペースで代用)

簡単にコードを綺麗に書けるらしいと言うことではてなブログを開設したクチなので、
なんとか使える状態にできてホッとしています。
これで忘備録作成が捗るかな…?

Unityでノベルゲーっぽいテキスト表示機能を作る2(Text Assetからstringへデータを変換する)

f:id:wataseshiu:20140408235837j:plain

↑前回作ったこれ(Text Assetと言うそうです)をスクリプト上で扱い易いように

string型のデータに変換します。

Text Assetのままでも多分やり方はあるのでしょうが、

よくわからないので何となく分かりそうな方法を取ります。

 

▼とりあえずの方針

 まずは1つの長ったるいデータになってしまっているのを分割して見やすく。

 上の画像で言う1行を一つのstring変数として持つようにします。

 するとstring[0]は「1000,テスト1,1」となりstring[1]は「1010,テスト2,2」となる。

▼使えそうな機能を探す

 string = TextAsset.text;

 こう書くだけでTextAssetをstringに変換出来るようです。

 無事にstringに変換できたので、テキスト分割に進みます。

▼使えそうな機能を探す

 string[index].Split();

 string変数を引数で指定した文字列のところで分割する機能を見つけました。

 これを使ってテキストの分割に挑みます

 

//インポートしたテキストを分割する機能に使う変数

private string splitMark = "\n";

public string[] splitedText;

 

void Start () {

viewText = importText.text;

//splitMarkで設定した文字列ごとにテキストを分割する

splitedText = viewText.Split(splitMark[0]);//splitedTextにはcsvの1行ずつが入っている

}

 

f:id:wataseshiu:20140409003129j:plain

こんな感じに1行ずつ配列データになりました。

 

private string splitMark = "\n";

splitMarkで使った\nという文字列は改行を表しているそうです。

今回の場合、改行が入るまでを1つのstring変数として分割するという挙動をとっています。

おそらく","としてコンマを使うと、コンマがくる毎にstringを分割してくれます。

 

viewText.Split(splitMark[0]);

この[0]は何なんだって話ですがよくわかっていません。

参考にした他所様の記事でそうなっていたのでそのままにしています。

たぶん「分割して沢山配列が出来たうちの何番目の配列から格納するか」みたいな話じゃないかなあ。

▼おわり

さらにコンマで分割するのもありかもしれませんが、

コンマでも分割すると、そのデータをどう管理すればいいのかよく分かっていません。

たぶん二次配列を作ったりするのでしょうが、分かりにくいのでとりあえずパス。

次でNGUI表示を行います。

Unityでノベルゲーっぽいテキスト表示機能を作る1(テキストファイルの扱い)

まずはテキストファイルをUnity上で使えるようにする。

 

▼インポート

何はともあれインポートします。

他のファイル同様、入れたいテキストファイルをD&Dするだけです。

 

↓インポートしたらInspector上では何か変なテキストデータになってるんだけど・・・

f:id:wataseshiu:20140408235414j:plain

 

▼ハマったポイント:テキストファイルの文字エンコード

テキストデータがバグってたら、テキストファイルのエンコードを確認する。

どうやらANSIだとバグるみたいです、Unicodeに変更。

f:id:wataseshiu:20140408235653j:plain

↓なんということでしょう…正しくテキストが表示されました!

f:id:wataseshiu:20140408235837j:plain

 

ちなみにエクセルのマクロでテキストファイルを自動出力している場合、

一度エンコードを変更してやればそのあとデータを上書きしても

テキストがバグることはありませんでした。

 

▼おわり

これでインポート完了です。

次はUnity上で(私が)扱い易いようにstring型のデータを作成します。