tanaka's Programming Memo

プログラミングについてのメモ。

Unity1週間ゲームジャムへの道 前日

f:id:am1tanaka:20191013221535p:plain

昨日は台風で最大警戒していたため作業無し。いよいよあとちょっとでお題発表です!その前にできる最低限の準備をしてしまいましょう。

目次

Unityバージョンの確認

unityroomで使えるUnityの最新版は2019.2.xです。バージョンを決めてしまいましょう。

  • ビルドの速さ、機能の多さ、パフォーマンスの良さを重視するなら、Unity2019.2の最新版
  • Unity公式を信じて安定版を選ぶなら、Unity2018.4の最新版
  • 短期間だしリスクを減らしたいなら、今お使いのやつ。ただしUnity2019.3以降は除く

今回、自分は複雑なことはやらないので不具合は出なかろうということで最新の2019.2.9でいってみます。

本来は一番安定しているはずの2018.4.9ですが、不具合があるというのをTLで見たことがあります。自分が使っている範囲では問題は起きてないのですがちょっと不安です。安定を求める場合は、今お使いのバージョンを使う方が無難かも知れません。

バージョンを決めたら、必要に応じて本体とWebGLのパッケージをインストールします。

プロジェクト作成とGitHubやUnity Collaborateへパブリッシュ

お題が発表される前なのでタイトルは決まっていませんが、自分の場合は1週間ゲームジャムの時期でプロジェクトを作成してしまいます。今回は2019年の10月開催なので、u1wgj-1910のような名前でプロジェクトを作成しています。

プロジェクトを作成したら、すかさずGitHubやUnity Collaborateなどでバージョン管理を開始するのがオススメです。一人で開発する場合はコンフリクトのリスクもないので、作業を進めたらすぐにコミットとプッシュをしておけばいざという時になんとかなります。

ビルドテストとデプロイ

WebGLビルドはいろいろ起きるので、一度ビルドしておくのがよいです。

プラットフォームをWebGLに切り替え

プラットフォームはあとで切り替えると時間がかかるので、最初にWebGLに切り替えてしまいましょう。

Player Settings

WebGLに切り替えたら、Player Settingsで以下のようなものを設定しておきます。

  • Company Name
  • ResolutionのDefault Canvas WidthとHeight
    • 解像度がすでに決まっていたら解像度もこの時点で設定します。まだ決めてない場合は、unityroomのデフォルト値である960x540にしておくと楽です
  • Unityのバージョンが古い場合、Memory Sizeの設定が必要かも知れません。256MBにしておくとunityroomのデフォルトのサイズになるので楽です

あとは適宜、必要そうな項目があれば。

仮プログラム

何も表示しないと動いているか分からないので、Time.timeを表示する以下のようなスクリプトを作って、Main Cameraにアタッチします。

  • HierarchyウィンドウからMain Cameraを選択します
  • InspectorウィンドウからAdd Componentをクリックして、New Scriptをクリックして、DrawTimeという名前でスクリプトを作成します
  • スクリプトを以下のものに差し替えます
using UnityEngine;

public class DrawTime : MonoBehaviour
{
    private void OnGUI()
    {
        GUI.Label(new Rect(20, 20, 100, 40), Time.time.ToString());
    }
}
  • 上書き保存してUnityに戻ります

以上で実行すると、起動してからの経過秒数が表示されます。

f:id:am1tanaka:20191013213717p:plain
経過秒数を表示

以上できたら、WebGLでビルドしてエラーが出ないことを確認します。エラーが出たら、ニムさんの以下のブログなどで原因を探してください。

nimushiki.com

日本語のフォルダー名やファイル名を使っていることが一番可能性が高いです。特に、ユーザー名が日本語というのは致命的です。新しく半角英数のユーザー名の新しいユーザーを作るとかしか対策がない場合があるので、早めの確認が必要なのです。

注意

ビルドが成功したらDrawText.csスクリプトは不要なので、Main CameraからRemoveして、ファイルを削除してください。

unityroomへアップロード

unityroomへアップロードするには、Twitterアカウントが必要です。詳しいアップロード方法は以下のnaichiさんのブログをご参照ください。

blog.naichilab.com

以上で、無事に動作が確認できれば安心です!

これを締め切りギリギリにやろうとすると、思わぬ不具合にぶち当たることが多々あります。まだ本格的に作業を始められないこの時間を使ってやっておくのが吉です。

使うであろうアセットをインポートしておく

TextMeshPro

TextMeshProは使いますよね。ということで、以下をやっておきます。

  • WindowメニューからTextMeshPro > Import TMP Essential Resourcesを呼び出して、Importをクリックします

f:id:am1tanaka:20191013213206p:plain
TextMeshProの初期設定

WebGLはフォントを組み込まないと日本語が表示されません!@thorikawaさんの以下のブログを参考に、とりあえず汎用的に利用できそうな日本語フォントを作成しておくとよいです。

qiita.com

フリーフォント探しはcolissさんのこちらがオススメ。

coliss.com

ネットランキング

ネットランキングは組み込んでおいた方がいいです。naichiさんの以下のブログの通りに進めれば、20分もあれば組み込めるはず。

blog.naichilab.com

画像付きツイート

やまださんがimgurという画像共有サービスを利用した画像付きツイートのライブラリを公開してくださっています。

github.com

ユウさんが手順を丁寧に書かれておりますので、こちらをご参考に。

unity-senpai.hatenablog.com

-1日目まとめ

ここまでの作業は、どのような企画であっても共通の手順なので事前に行っておくと吉です。

  • Unityのバージョンの決定とインストール
  • プロジェクトの作成とGitHubやUnity Collaborateへのパブリッシュ
  • プラットフォームをWebGLに切り替え
  • Player Settingsを設定
  • WebGLビルド
  • unityroomへアップロード
  • よく利用するアセットやサービスのインポートと動作確認

あとは必要に応じて、シーンの切り替えやら、音声の再生やら、よく使うアセットなどをインポートしておくとよいでしょう。

さて、あと少しでお題発表です。参加される皆様、頑張りましょう!!

参考URL

Unity1週間ゲームジャムへの道 -3日目

f:id:am1tanaka:20191011214907p:plain

昨日まとめた方針を元に案出しをしました。

目次

マルズラット(仮)

考えていくに従って無機質なアイディアに流れがちになり、もっとテンションの高いやつを・・・!と顔をいくつか描いているうちに、困った時に頼りになるスネークゲームが頭をよぎりました。

f:id:am1tanaka:20191011210740p:plain
マルズラット(仮)

1画面の1ボタンゲーム。

  • 丸いやつ一匹でゲーム開始
  • ゲームを開始すると、右か左に一定速度で移動を始めます
  • クリックでジャンプして、ジャンプ中にクリックするとすぐに降下します
  • 画面端に辿り着くと、移動方向を反転します
  • 床には下や横からはぶつかりません
  • 緑のエサを取ると、スピードとジャンプ力がアップして、子分が1匹つきます
  • 取ったエサは、一定時間が経過すると特定の範囲内に復活します
  • 青いのにぶつかるか、子分に衝突するとゲームオーバーです
  • ジャンプ力を上げて、画面上部にある何かを取るとクリアです
  • クリア時の子分の数がボーナスになります
  • ネットランキング対応

安全にクリアするには、なるべく早くクリアした方がよいですがスコアが伸びません。リスクを冒して、エサを集めまくって、ギリギリでゴールを目指します。

マルネット(仮)

f:id:am1tanaka:20191011211609p:plain
マルネット(仮)

もっとあっさり、多人数で遊べないかと考えたやつ。

  • 8人ぐらいで遊ぶ
  • 方向と力を決めて、一斉に発射
  • 床に穴が開いているとか、爆弾があったりして、そこに接触すると脱落
  • さいごまで生き残った人が勝ち

ネットワークに対応できるのかや、ルールがまだぼんやり。いずれ作ってみたいけど今回ではないかな?どうかな?

その他

f:id:am1tanaka:20191011211936p:plain
その他企画

思いつくままに落書き。昨日考えていたタイミングものとか、パワーと方向をタイミングで決定する三段跳びとか、仕分けとか、フラッピーバード的なのとか、シューティング的なのとか。どんどん無機質な感じになっていったので多分ボツ。

でも最初のタイミングを合わせるやつの絵面は面白そう。

-3日目まとめ

マルズラットは床が曲者。UnityEngine.PlatformEffector2D - Unity スクリプトリファレンスを使うと楽にできるのですが、1年生の講義で扱ってません。使い方は簡単で、マニュアルを読めば十分使えるレベルなのでまあいいか。

企画の弾込めはある程度できた感じがします。週末に余裕があれば、シーン遷移などの素振りをやります。

明日は記録的な台風がやってくるとのこと。ある程度の備えはしましたが、うちは古くて耐震強度とかいうレベルではないので何があるか分かりません。なんとか耐えてくれますように。台風が上陸する地域の皆様もくれぐれもお気をつけて。

Unity1週間ゲームジャムへの道 スタート:-4日目

f:id:am1tanaka:20191010231654p:plain

フライング3日目です。昨日最後に考えた、初心者が使える技術縛りの企画はどうかということで、1年生の前期にやった内容を整理していました。

目次

1年生の前期にやったことの振り返り

こんな感じでした。

プログラミング

  • 変数、計算、分岐、繰り返し、配列、ユーザー関数
  • 乱数
  • マウス、キーボード操作
  • カメラ(背景色、FOV、Orthographicなど)
  • UI、レイアウト
  • シーン遷移
  • Rigidbody
  • マテリアルとPhisicsMaterial
  • オブジェクトの構築方法(親に移動や物理。子にモデル)
  • CollisionとTrigger
  • タグとレイヤー
  • 生成と破棄
  • ネットランキング
  • BGMとSE
  • static

アセット関連

  • 組み込みの3Dオブジェクト
  • 無料のアセットストアやgithubのアセット
  • 音フリー素材
  • フリーフォント
  • TextMeshPro
  • pps
  • パーティクル
  • アニメーション
  • probuilder

改めて振り返ってみて、重要な項目はちゃんとやっていたということでほっとしました。

ざっくりと方針

この縛りでも案1は作れそうではあるけれど、世界観とかキャラインパクトでなんかできないかとか。前回のTana Tomoさんのキメラのやつとか、つながるの時の週末リキオさんのあうーのとかが凄くよかった。

キメラのやつ unityroom.com

あうーのやつ unityroom.com

といいつつ、アセットを作る時間も割きたくはないので、何か良き手はないものか。現段階で思い浮かんでいること。

  • 脱力系にできないものか
    • 円だけでキャラクター性を出したい
  • 作りはワンシーンで
    • 初期化が面倒なので、リトライのどこかの時点でシーンを読み直す
  • ネットランキング前提
  • ワンボタン
  • さくっと繰り返し遊べる感じ
  • やや不条理

円の顔に円で目を描いて、それで表情を出したい。それが面白くなるような動き、そして、その動きを使ったルール。ジャンプとか、シャッフルして目ががちゃがちゃになるとか、沢山いるのが見てくるとか。

沢山並んでいるのはいいかも。動きをタイミングよく真似する?

ジャンプの衝撃で目がビヨンビヨンするのでも面白いかな?タイミングよく何段もジャンプしていくとか。

-4日目まとめ

PPSとProBuilderは使えるし、一通りのことはできそうです。有料アセットは今回は使いませんが、GitHubに演出系も色々あるので案外不自由しないかも。

明日はこれをベースに引き続きアイディアを出して、可能ならサムネイルを描く。ワンシーンの素振りもできれば。台風対策が第一ですが。今日はこれまで。

参考作品

unityroom.com

unityroom.com

Unity1週間ゲームジャムへの道 スタート:-5日目

フライング2日目ですよ。

f:id:am1tanaka:20191009181444p:plain

目次

案1のTODOリスト

新しいアイディアが思い浮かぶでもなく、とりあえず昨日の案1について移動中の電車でTrelloに作業リストを作成。

f:id:am1tanaka:20191009172015p:plain
TODOリスト

ライフ制で考えていたけど、その場で失敗でいいやということで工数を削ってざっくり18工程。まだ多いし、考えながら気にかかった部分が出てくる。

案1に感じること

以下の3点が気になってます。

  • 新規性がない
  • タイミングを目指すのはあるけど、駆け引き的な要素がなく、ゲームに緩急を付けられるかが難しそう
    • 狭い場所では敢えてタイミングをずらして安全にクリアを目指す、というのはできるかも知れない
  • 少し工数が多いかも

もっとシンプルに、取って出しでできるようなネットワーク使ったなんか、というのとか思い浮かぶといいなと思いつつ。

アセットのテスト

昨日見つけていた水とかメタボール系のやつを一通り見てみました。全部、思ってたのと違った...。画面のオブジェクトに対してシェーダーでよしなにメタボってくれるのかと思ってたのだけど、内部的にメタボールの場所とかを管理して画面に出力しているみたいだった。コードを読んで、座標を何らかのゲームオブジェクトに対応づければいけそうではあるけど。

Water 2Dが、水のしずくとなるプレハブがあるので、改造がしやすそうでした。案1を進めるならこれの調査継続です。

assetstore.unity.com

索敵ライトが凄く動きとして面白かったです。

baba-s.hatenablog.com

ちょっと重そうなので、WebGLビルドしてパフォーマンスを見たかったけど時間足りず。

企画案

企画案追加。

索敵ライト案

  • ステージ内をうまく照らして敵をこっちに来させない
  • オブジェクトをうまく配置して、光をあてないといけないオブジェクトや、影にしないといけないオブジェクトを守る
  • 光か影のところが壁とか床になって通路を作っていく(たアケイクさんのパクリ気味...

unityroom.com

色々面白そうだけど、ステージ制になりそうでちょっと今回は難しいかな?

ラクガキ王国みたいなやつ

線を描いて物体化する以下のアセットを軸にした案です。

assetstore.unity.com

  • 決まった線の長さでオブジェクトを生成
  • 形によって効能が変わる、あるいは、形にアイテムなどで性質を与える
  • ゴールに辿り着けるようにする
  • アルゴリズム体操的な仕掛けを作ってステージクリアを目指す

これも面白そうだけど、このままだとしんどそう。あと、ブログのあとに更新されて有料アセットになってたんですね。

ML-Agent

  • サンプルのどれかを適当に改造

github.com

楽し気なのがあるので、それをベースにするとか。

いっそ、初心者向けにベタなものにする

これもありかもと考えています。チュートリアル本の序盤に出てくるような基本要素でも工夫で結構できますよ、という方針もいいかも知れません。

-5日目まとめ

いくつかアセットを触ってみて、思っていたのと違うとか、面白そう、というのを確認しました。

初心者向けのベタ要素企画に気持ちが傾いています。意義がありますし(作るの楽ですし)。明日は基本要素とはではなんぞ?という辺りを考えてみるかなということで、フライング2日目終わります。

Unity1週間ゲームジャムへの道 スタート:-6日目

f:id:am1tanaka:20191008232132p:plain

10/14(月)からUnity1週間ゲームジャムが始まります。

unityroom.com

今回は個人的にはデジゲー博の準備、学校はDATフェスタという学園祭の準備で全然時間が避けそうにありません。が、参加はしたい。

ということで、徹底的に目的を絞った上でフライングで準備を進めて、なんとか参加することを目指します。あれこれ忘れそうなので作業メモを公開しつつ進めてみます。

目次

今回の目的

以下にコンパクトに留めるか。以下、今回の掟。

  • 実作業1時間+進捗メモ執筆。企画などは移動時間を活用
  • ランキング入りは目指さない!!
  • 参加者(特に初参加)のみなさんの作品をなるべく遊んで評価やコメントする
  • 実験要素を一つ導入して、あとは徹底的にコンパクトに

調査-実験要素と画面作り-

最近のセールで買い込んだアセットやGitHubのリストやUniteの動画を見て、画面の方向性を検討します。今回もプリミティブなやつでささっとやりたいのですが、メタボールとか水っぽいとか、何か動きを付けたい気がしています。買い込んだアセットもあるけど。以下の辺りを見て検討します。

assetstore.unity.com

baba-s.hatenablog.com

www.youtube.com

www.youtube.com

目についたアセットやリポジトリ

アセットストアやコガネブログさんの例のブログを見て、気になったものを列挙。

ゲームのアイディアになりそうなやつ

インクを塗るやつ

assetstore.unity.com

絵を描く系

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

水、メタボール

assetstore.unity.com

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

ベクター画像

assetstore.unity.com

索敵ライト

baba-s.hatenablog.com

ネットワーク

assetstore.unity.com

AI

unity3d.com

ゲームアイディアとは関係ないけど良さげなエフェクト

カメラエフェクト

assetstore.unity.com

アスキーアート、鉛筆、ハッチング、など

assetstore.unity.com

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

背景のグラデーション

baba-s.hatenablog.com

baba-s.hatenablog.com

baba-s.hatenablog.com

アニメみたいな動き

baba-s.hatenablog.com

開発時に便利そうなやつ

2D画像作成

assetstore.unity.com

音の制御

assetstore.unity.com

その他

技術的なところではDOTSも気になっているけど、今回は時間的に無理そうなので手は出さずかな。

unity.com

アイディア

とにかくシンプルにワンボタンでテンポもの、ということでざっくり1案をiPadに殴り書き。

f:id:am1tanaka:20191008230425p:plain
案1

メタボールか水のやつで、今回も音を同期させたい感じ。事前にビートのタイミングでプレイヤーの移動を制御したいので、Music.csは使わずにBPMから自前計算かなという感じ。スマホ向きなので縦画面がよさそう。

ざっくりだけどランキングつけたら楽しそう。いつもの悪い癖でちょっと大きくなってきている感じがするので、もっと削れないか検討しつつ、工数出しを明日の移動中にしてみようかなと。

-6日目まとめ

目的を決めて、アセットなどの情報を頭にインプットして、ざっくり1案出してフライング初日終わり。アセット眺めてるだけで午前中が終わってしまった。デジゲー博の準備に役立つものも色々と見つかったのでこういう作業は必要ですね。アセットストアで見つからなかったものがGitHubでいくつか見つかりました。

描く系とかエフェクトも気になっているので引き続き一人ブレストしながら、明日はリポジトリーとかフレームワークの準備をうっすらはじめる予定です。

AsyncOperationHandleについて

Addressable Asset SystemでシーンをLoadした時の戻り値はAsyncOperationHandle<T>です。LoadSceneAsync()で返ってくるのと違うので、以下はどうやったらよいのやら。

  • 自動的にアクティブにならないように読み込んだシーンをアクティブにする方法
  • 通信エラーを考慮した処理の組み立て方

ということで調べたことのメモです。まずは以下を読んでみました。

docs.unity3d.com

目次

意訳

AsyncOperationHandle構造体は、Addressablesの色々なAPIの戻り値で利用されます。主に、アクセス状況や結果にアクセスするのに使われます。処理結果は、AsyncOperationHandle.Release()を呼んだり、Unloadするまで残ります。

処理が完了すると、AsyncOperationHandle.StatusAsyncOperationStatus.Succeeded(成功)かAsyncOperationStatus.Failed(失敗)になります。成功していたら、AsyncOperationHandle.Resultを通じて処理の結果にアクセスできます。

処理が完了したかどうかはStatusをチェックするか、AsyncOperationHandle.Completeを使って処理が完了した時に呼び出すコールバックを登録します。

AsyncOperationHandleが返したAddressablesAPIにアクセスするためのリソースが不要になったら、Addressables.Releaseメソッドを呼び出して解放します。詳しくはこちら( Custom Operations | Package Manager UI website )。

Typed vs Typeless

多くのAddressables APIは、ジェネリックAsyncOperationHandle<T>を返します。これにより、AsyncOperationHandle.CompletedイベントのAsyncOperationHandle.Resultの型を指定して安全に扱えます。一方、非ジェネリックAsyncOperationHandleもあります。ジェネリックと非ジェネリックはコンバートして相互に利用できます。ただし、もし非ジェネリックなハンドルを、異なる型のジェネリックにキャストすると実行時に例外エラーが発生します。

読み込み完了のイベント例

AsyncOperationHandle.Completedを使って読み込み完了時に呼び出すコールバックを登録する例です。

private void TextureHandle_Completed(AsyncOperationHandle<Texture2D> handle)
{
    if (handle.Status == AsyncOperationStatus.Succeeded)
    {
        Texture2D result = handle.Result;
        // これ以降、Textureを利用できます
    }
}

void Start()
{
    AsyncOperationHandle<Texture2D> textureHandle = Addressables.LoadAsset<Texture2D>("mytexture");
    textureHandle.Completed += TextureHandle_Completed;
}

AsyncOperationHandleが返すIEnumeratorで待つ

AsyncOperationHandleIEnumeratorを返すので、コルーチンで読み込みの完了を待つことができます。

public IEnumerator Start()
{
    AsyncOperationHandle<Texture2D> handle = Addressables.Load<Texture2D>("mytexture");
    yield return handle;
    if (handle.Status == AsyncOperationStatus.Succeeded)
    {
        Texture2D texture = handle.Result;
        // 以降、Textureが使えます

        // Textureの利用が終わったら、リソースを解放します
        Addressables.Release(handle);
    }
}

Async awaitで待つ

AsyncOperationHandle.Taskプロパティーを使って、Async awaitで処理を待つこともできます。

public async Start()
{
    AsyncOperationHandle<Texture2D> handle = Addressables.Load<Texture2D>("mytexture");
    await handle.Task;
    if (handle.Status == AsyncOperationStatus.Succeeded)
    {
        Texture2D texture = handle.Result;
        // 以降、Textureが使えます

        // Textureの利用が終わったらリソースを解放します
        Addressables.Release(handle);
    }
}

意訳、以上。

シーンを有効にするには

AsyncOperationHandleの説明には載っていませんでした。スクリプトマニュアルの方にありました。

読み込みが完了した時に渡されるSceneInstanceが持つActivate()メソッドを、読み込みたくなったタイミングで呼び出せばシーンを有効にできるそうです。

おまけ。LoadSceneAsync()の定義と引数について。

public static AsyncOperationHandle<SceneInstance> LoadSceneAsync(object key, LoadSceneMode loadMode = null, bool activateOnLoad = true, int priority = 100)
Type Name 説明
System.Object key 読み込むシーンを指定するAsset Addressです。
LoadSceneMode loadMode 読み込みモードです。LoadSceneMode.Singleなら、全てのシーンを閉じてから新しいシーンを読み込みます。LoadSceneMode.Additiveなら、現在のシーンはそのままに新しいシーンを追加読み込みしてマルチシーンにします。
System.Boolean activateOnLoad falseにするとシーンの読み込みが完了しても自動的には有効になりません。バックグラウンドでシーンを読み込みたい時などに利用します。有効にしたいタイミングで、SceneInstanceのActivate()メソッドを呼び出すことで有効にできます。
System.Int32 priority シーン読み込みの非同期処理における優先順位を指定します。

第1引数がIResourceLocationでシーンを渡すメソッドもあります。

メモリ管理について

Memory Mangement | Package Manager UI website より。

LoadとUnloadをセットで正しく呼び出せば使用していたメモリーは正しく解放されます。SceneLoadingについては、Addressables.UnloadSceneAsync()メソッドに解放したいシーンを渡して解放するか、Singleモードで別のシーンを読み込むと前のシーンとハンドルが両方解放されます。

補足

Addressables.UnloadSceneAsync()の第2引数にfalseを渡すと、シーンをUnloadしても、ハンドルは解放しなくなります。シーンを再利用したい時などに利用するためのもののようです。迂闊に使わない方がよさそうです。

まとめ

以上でおおよそ把握できました。シーンをバックグラウンドで読み込んであとでアクティブにするには、読み込み時にactivateOnLoadfalseにしてシーンを読み込んで、読み込みが完了した時に返されるSceneInstanceActivate()を呼び出せばシーンを有効にできます。

エラー処理は、処理の完了を待って、戻り値のStatusで成功と失敗を見分けます。

シーンの読み込みと解放については、シーンを切り替える際にAddressables.UnloadSceneAsync()で追加シーンを解放するか、Singleモードで新しいシーンを読み込みます。

こんな感じでいけそうです。

参考URL

ProTexでプロシージャルにUI用のイメージを作る

毎度作品を作っていて、ボタンなどのUIの画像をUI Builderから持ってきているのですが、なんかもっといい方法ないかとうっすら思っていたところ、ご存知AssetSaleLove@汗人柱さんのツイートが目に飛び込んできました。

本来のテクスチャー用途で利用する方法は、VR発掘隊さんが以下の記事でまとめてくださっています。

qiita.com

テクスチャーには画像を生成せずに利用する方法があるのですが、Imageコンポーネント向けのスクリプトが用意されていないので、UIで使うには画像化が必要になります。せっかくプロシージャルで形状を作ったのだから画像ファイルを作らずに使いたい!ということで、ちょちょっとスクリプトを用意してみました。ボタンで使えそうな角丸四角形の作り方と設定方法をご紹介します。

目次

やりたいこと

以下のようなボタン用の角丸四角形のイメージを、画像ファイルの用意なしに作ってみます。

f:id:am1tanaka:20190904160903p:plain
作りたい角丸ボタン

要件

ProTexの要件は、Unity2018.3.0以降です。今回試した環境は以下の通りです。

  • Windows10
  • Unity2019.1.5
  • ProTex 1.0

角丸四角形を作る

角丸四角形をProTexエディターで作成します。

  • Unityを起動して、適当なプロジェクトを作成するか開きます
  • 以下のアセットをゲットして、プロジェクトにインポートします

assetstore.unity.com

ProTexTextureを作成

ProTexでテクスチャーを作成するには、ProjectウィンドウからProTexTextureアセットを作成します。

  • ProjectウィンドウのCreateボタンをクリックして、ProTex > ProTexTextureを選択します
  • RoundRectという名前にしておきます

以上でテクスチャーを作成するためのアセットができました。

形状を作る

形状を作るビジュアルグラフを開きます。

  • 作成したRoundRectアセットをクリックして選択します
  • Inspectorウィンドウの右上のOpenボタンをクリックすると、ビジュアルエディターが開きます

f:id:am1tanaka:20190718152911p:plain
ノードエディターを開く

ProTexウィンドウの左側のワークスペースエリアを右クリックするとノードリストが表示されます。それぞれがどのようなものかは、Assetsフォルダー内にあるProTexManual.pdfNODES REFERENCEを眺めると、おおよそ把握できると思います。

f:id:am1tanaka:20190724140413p:plain
ノードリスト

角丸四角形を作ります。

  • 右クリックしたメニューからShape > Rectangleを選択します
  • 作成したノードをクリックして選択します

右下にパラメーターが表示されます。スライドバーを操作して効果を確認するとよいでしょう。

f:id:am1tanaka:20190724141007p:plain
パラメーター

以下を設定します。

  • WidthHeightをどちらも1にして、最大サイズにします
  • Roundness1にして、角を丸めます
  • Falloff0.05ぐらいにして、縁をくっきりさせつつ滑らかにします
  • AlphaOperationにして、図形以外の場所を透明にします
  • 以上設定したら、Apply Changesボタンをクリックします
  • Rectangleoutをドラッグして、Outputcolorにドロップします

f:id:am1tanaka:20190724141428p:plain
ノードをつなぐ

  • 左上のSave Assetボタンを押して保存します

以上で角丸四角形ができました!

UIでProTexを使う

作成したProTexTextureをUIで直接使えるようにします。以下の手順に従って、2つのスクリプトをプロジェクトに追加してください。

イメージにProTexTextureをバインドするスクリプトを追加

  • ProjectウィンドウでCreateボタンをクリックして、C# Scriptを選択して、名前をProTexImageBinderにします
  • ProTexのImageをバインドするためのスクリプト · GitHubを開きます
  • Rawボタンをクリックして、[Ctrl]+[A]キーですべて選択して、[Ctrl]+[C]キーでコピーします
  • Unityに切り替えて、作成したProTexImageBinderスクリプトをダブルクリックしてエディターで開きます
  • [Ctrl]+[A]キーを押してから[Ctrl]+[V]キーを押して、コピーしてあったコードを貼り付けます
  • 上書き保存します

以上で、バインド用のスクリプトができました。続けて、エディター用のスクリプトを追加しておきます。

  • Projectウィンドウから、ProTex > Editorフォルダーを開いて、Scriptsフォルダーを右クリックします

f:id:am1tanaka:20190724154400p:plain
EditorのScriptsフォルダーを右クリック

  • Create > C# Scriptを選択したら、ProTexImageBinderInspectorの名前にします
  • ProTexImageBinder用のエディタースクリプト · GitHubを開きます
  • Rawボタンをクリックして、[Ctrl]+[A]キーですべて選択して、[Ctrl]+[C]キーでコピーします
  • Unityに切り替えて、作成したProTexImageBinderInspectorスクリプトをダブルクリックしてエディターで開きます
  • [Ctrl]+[A]キーを押してから[Ctrl]+[V]キーを押して、コピーしてあったコードを貼り付けます
  • 上書き保存します

以上で環境ができました。ボタンに設定をします。

ボタンにProTexを適用する

  • HierarchyウィンドウからCreateボタンを押して、UI > Buttonなどで、ボタンを作ります
  • 作成したボタンに、ProTexImageBinderスクリプトドラッグ&ドロップして、アタッチします

f:id:am1tanaka:20190724154941p:plain
スクリプトをアタッチ

  • 先に作成したRoundRectアセットをドラッグして、ProTexTexture欄にドロップします

f:id:am1tanaka:20190724155203p:plain
ProTexTextureを設定

以上で、ProTexが生成したテクスチャーがボタンのImageに設定されます。

利用したいテクスチャーの大きさは`Texture Sizeからはじまるコンボボックスで選択します。サイズはPlayすると正式なものになります。Playをした時に、ぼやけないなるべく小さい値に設定するとよいでしょう。

f:id:am1tanaka:20190904160903p:plain
出来上がり!!

まとめ

ProTexで画像を作り、スクリプトを2つ追加して、UIのボタンにProTexTextureを反映させることができました。なかなか楽ちんで、アイコンの図形などもProTexで作成してます。

回転角度の自由度が少ないとか、数値が直に入力できないとか、細かい部分にあともう一歩機能があれば・・・というところもあるのですが、無料でこれは凄くありがたいアセットです。作者さんに感謝!!

参考URL