表編: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
Google App Scriptをスプレッドシートから呼べるようにする
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でアタッチしたら完成です。
これでひとまずテキストファイルのデータをUnity上で表示させることができました。
この先は自分に必要な機能を使いやすいように分かる範囲で追加していく事になります。
▼おわり
次はいま「AAA,欲しいテキストデータ,CCC」となっているstringの中から、
欲しいテキストデータだけを抜き出して扱えるようにします。
やることは前回のSplitをまた使うだけです。
ようやく余分なものの無いテキストを表示させることが出来るようになります。
はてなブログでコードを綺麗に記載する機能(シンタックスハイライト)を使うための設定
class HogeClass{ int hogehoge; //コメントもOK void HogeFunction(int value){ hogehoge = value; } }
ただしこれに沿っただけでは上手く表示されませんでした。
ブログ開設直後の状態では、はてな記法(?)が使えない事が原因でした。
シンタックスハイライトの機能を使うのに必要なものらしいです。
Unityでノベルゲーっぽいテキスト表示機能を作る2(Text Assetからstringへデータを変換する)
↑前回作ったこれ(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行ずつが入っている
}
こんな感じに1行ずつ配列データになりました。
private string splitMark = "\n";
splitMarkで使った\nという文字列は改行を表しているそうです。
今回の場合、改行が入るまでを1つのstring変数として分割するという挙動をとっています。
おそらく","としてコンマを使うと、コンマがくる毎にstringを分割してくれます。
viewText.Split(splitMark[0]);
この[0]は何なんだって話ですがよくわかっていません。
参考にした他所様の記事でそうなっていたのでそのままにしています。
たぶん「分割して沢山配列が出来たうちの何番目の配列から格納するか」みたいな話じゃないかなあ。
▼おわり
さらにコンマで分割するのもありかもしれませんが、
コンマでも分割すると、そのデータをどう管理すればいいのかよく分かっていません。
たぶん二次配列を作ったりするのでしょうが、分かりにくいのでとりあえずパス。
次でNGUI表示を行います。
Unityでノベルゲーっぽいテキスト表示機能を作る1(テキストファイルの扱い)
まずはテキストファイルをUnity上で使えるようにする。
▼インポート
何はともあれインポートします。
他のファイル同様、入れたいテキストファイルをD&Dするだけです。
↓インポートしたらInspector上では何か変なテキストデータになってるんだけど・・・
▼ハマったポイント:テキストファイルの文字エンコード
テキストデータがバグってたら、テキストファイルのエンコードを確認する。
どうやらANSIだとバグるみたいです、Unicodeに変更。
↓なんということでしょう…正しくテキストが表示されました!
ちなみにエクセルのマクロでテキストファイルを自動出力している場合、
一度エンコードを変更してやればそのあとデータを上書きしても
テキストがバグることはありませんでした。
▼おわり
これでインポート完了です。
次はUnity上で(私が)扱い易いようにstring型のデータを作成します。