原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】ロックオンターゲットをパーティクルで作成する

試行錯誤

次回作についてアレコレ試行錯誤をしていく中で、『(知る人ぞ知る名作ゲーム)DATA WINGっぽいゲームを作ってみよう』などと、おこがましい考えが頭をよぎったのですが、案の定、早々に挫折してしまい、今のところ3Dシューティングゲームの方向でプロトタイプ版を作成している最中です。

 

f:id:Karvan:20190625235025p:plain

 

シューティングゲームなので銃弾を発射するのは当たり前なのですが、他のシューティングゲームでもそうであるように、ただ弾丸が前方に飛ぶだけでなく、敵をロックして誘導弾を発射するといったロックオンシステムも実装しよう、と思うわけです。

 

ここで敵をロックする、ということはそれがプレイヤー側に分かるようにロックオンターゲットを表示する必要があるわけで、今回はこのロックオンターゲットを表示する手法についてのお話

 

ロックオンターゲットの表示

ロックオンターゲットを表示する手法は色々あるのですが、代表的なものとしては

  • uGUIにてターゲットを表示する
  • Spriteでターゲットを表示する

といったような手法があります。

 

どちらの手法でもメリット・デメリットがあり、uGUIを使う場合、ターゲットアイコンはスクリーン上にあるので絶えず同じ形で表示できますが、ロックしたオブジェクトが動くたびにスクリーン上の座標を求めて追従させる必要があります。

 

また、Spriteを使う場合はターゲットアイコンをロックオブジェクトの子オブジェクトにすれば追従させる必要がないので手軽に実装できますが、親オブジェクトの向きに影響されてしまうので、絶えずスクリーンの方を向いて表示させようとするとちょっと面倒くさいです。

 

なので、これらのデメリットを解消するためにParticleSystemを使ってロックオンターゲットを表示させることにしました。

 

参照したのは以下の記事です。

qiita.com

 

ターゲットのアニメーション設定

ParticleSystemでもSpriteのようなアニメーションを設定することが出来ます。
今回はコマ割り画像を連続表示させてターゲットがグリグリ廻るアニメーションを作ります。

 

1.アニメのコマ割り画像を並べて一枚の大きな画像(Texture)を作る。

今回はこんな画像を作りました。

f:id:Karvan:20190625233131p:plain

 

2.そのTextureを指定したマテリアルを作る。

Particles/Additiveなどのシェーダを使ったマテリアルに先程のTextureを指定します。

f:id:Karvan:20190625233215p:plain

見づらいけどTextureに先ほどの画像を指定しています。

 

3.Particle SystemのTexture Sheet Animationでアニメーションを設定する

f:id:Karvan:20190625233338p:plain

 

ModeをGridに指定すると、Tilesと言う項目が現れます。

これは『TestureをX/Yのそれぞれに対して何分割するか』を設定しています。


これに加えてAnimationにWholeSheetを設定することで、テクスチャシート全体を順にアニメーションさせるようにします。

 

その他の設定

上記の設定でターゲットのアニメーションはできました。
次にParticleSystemを以下のように設定していきます。

 

f:id:Karvan:20190625233842p:plain

・LoopingのチェックをONにする

・PreWarmをONにして起動と同時に発生するように

・StartSpeedを0にしてその場に留まるようにする

 

f:id:Karvan:20190625234052p:plain

・RenderのRenderModeをBillboardに設定、併せてRender AlignmentにViewを設定

Billboardに設定することで、ターゲットのParticleは絶えずカメラ方向を向いて表示されるようになります。

 

あとはこのParticleSystemをロックオンしたオブジェクトの子オブジェクトに設定すればロックオンターゲットの完成となります。

 

f:id:Karvan:20190625234138g:plain

ロックオンしたオブジェクトにターゲットParticle表示

 

注意事項と追加

LoopingのチェックをONにしているので、Particleの生成を停止(=Stop)しただけではターゲットは消えません。


ターゲットを非表示にするにはStopコール時に生成済みパーティクルを全消去するオプションを設定するか、ParticleSystem自体のSetActiveをfalseにする必要があります。

 

ロックオンターゲットとしてはこれで十分なのですが、ちょっとコレだけでは地味なので、ターゲットのParticle表示前にロックオン発生のParticleを追加してみました。

 

こんな感じ

f:id:Karvan:20190625234314g:plain

わかりますかね?

ロックオンターゲット表示前に六角形が収縮するParticleを表示しています。

 

なとなくシューティングゲームっぽくなってきた気がしますが、未だ銃弾を撃てないんですよね。。。

 

【Unity】Alipay SDKについての続報

前回からの続報

前回の記事でAlipay SDKの使用を理由にGooglePlayからBANされた場合の対処法を記載しました。

www.karvan1230.com

その記事での紹介した対処法は

現在の回避策は、IAPを使用していない場合はUntiyChannel.libを削除し、Xiaomi Store SDKを追加しないようにすることです。

というものでしたが、当該トピックスに関するUnityForumでの議論は未だ続いているようです。

 

https://forum.unity.com/threads/google-bans-app-due-alipay-sdk.687451/

 

前回記事からの追加の情報としては、

IAPを使用していない、またはXiaomi Game Center SDKを使用していないにもかかわらずこの問題の影響を受けている場合は、Android Studioを使用してBuild / Analyze APK ...を選択し、APKを表示してプロジェクトのルートにあるAndroidManifestを確認し、XiaomiまたはAliPayへの参照を探します。参照が表示されない場合は、ゲームをGoogle Playに再送信しても問題ありません。

と言う返信がUnity Technologiesから上がっています。

 

GooglePlayから同じような理由でBANされていて、プロジェクトフォルダのPulginフォルダ内に「UnityChannel」が見当たらない、と言う方は、上記のように一度、Android Studioを使用してAndroidManifestを確認することをお勧めします。

 

進捗が無い・・・

ここ最近は次回作についてアレコレ試行錯誤して時間を過ごすばかりで、コレといった進捗がありません。

 

そもそも葦名の国でラスボスを倒したけどそのまま二週目を始めちゃってUnity起動してない、って話もありますけど、とりあえず夏までには簡易なプロトタイプ版をunityroomなりに公開できるように頑張りたい・・・と思います。

 

【Unity】GooglePlayにアプリをBan(削除)された話

人生Bluetooth

これまでゲームアプリを2本リリースするもコレといって話題にならず、ダウンロード数も伸びず、InideGameFestivalの審査にも落ち、アプリ宣伝用の資金も尽きたので、ゲーム開発者として底辺から這い上がるすべが全く見つからない現状なのに、以前から注目していたお顔がバカリズムにそっくりな平野センセイは5ちゃんねるにスレッドが4つも立つほどの大ブレイクを果たし、同期の友人は結婚して、フォロワーのツイートがバズる等、私の廻りではうらやましいことばかりが起こって、人生の世知辛さを身をもって体験している今日この頃、とりあえずモー娘。の新曲でも「どうでも良いような場面からヒント掴むから上に立つ」「待ってるときは来ないのに無意識なれば現れる」と唄っているので、それを信じて時が来るのを待ちたちと思います。

f:id:Karvan:20190611231053p:plain

 

ある日突然・・・

 

Gmailが一通のメッセージを受信しました。

 Hi Developers at Stab of Bee Project,
After review, Dull Things No Life,  has been removed from Google Play due to a policy violation.

(ハーイ、Stab of Bee Projectの開発者、ポリシー違反が見つかったから君たちのアプリ、"Dull Things No Life"はGoogle Playから削除したよ。)

なんともアメリカンらしい軽い口調で絶望的な内容を送ってくる、しかも英語で。

"ハーイ"じゃねぇよ、ヘーベルハウスか。

 

つい3ヶ月前にもAdMobの広告停止の通知が送られてきたことがありましたが、そのときも事前通告無く、一方的にAdMobアカウントが停止されましたね。

 

Googleさん、何か処分する前にちょっと確認するとか、是正を求める通知を出すとか、少しぐらい救済措置を考慮しても良いんじゃないですかね?そりゃトランプが大統領になるわ。

 

AdMobの広告停止の件に関しては私にも心当たりがあったので素直に反省したのですが、今回ばかりは身に覚えの無い罪を被せられた気持ちで、こっちとしては冤罪を訴えたい気持ちです。

 

なんせBanの理由が 

We've identified that your app is using Alipay SDK or library, which facilitates the transmission of phone number information without meeting the prominent disclosure guidlines.
(君のアプリがAlipay SDKまたはライブラリを使用していることが分かったんだ。これを使うとさぁ、ガイドライン?何それ?って感じで電話番号情報の収集が簡単になっちゃうんだよねぇ。)

いや、Alipay SDKとか知らんし、そんなSDK導入した覚えないし、むしろはじめて聞いたわ、そんなSDK 

Prior to the collection and transmission, it must prominently highlight how the user data will be used, describe the tyep of data being collected and have the user provide affirmative consent for such use.
(そんな情報を収集するんなら、ちゃんとデータの使用目的とか、データの種類とか説明する必要があるし、ユーザーとの同意も必要でしょ。)

 

If necessary, you can consult your SDK provider(s) for further information, or please upgrade AliPay SDK version to 15.5.5 or higher.
(もし必要なら、SDKプロバイダに問い合わせるか、AliPay SDKバージョンを15.5.5以降にアップグレードしてね。)

 

 Good Luck!とかでも言いたげな軽い文章。こちらとしては身が震える想いなんですがね。

 

そもそも全く導入した覚えの無いSDKの名前を挙げられても「SDKプロバイダに問い合わせる」とか「SDKバージョンをアップグレードする」とか無理ゲーじゃないですか。

 

「AliPay SDK」とか検索しても怪しげな中国語のページしかヒットしないし、Twitterを確認しても中華系アカウントのツイートしか上がっていないし、お手上げ状態。もう最後の望みでUnityのフォーラムを覗いてみると・・・あった!

 

Untiyフォーラムでの議論

Untiyフォーラムで、同様の理由でGoogle Playからアプリを削除された方のスレッドが上がっていました。

https://forum.unity.com/threads/google-bans-app-due-alipay-sdk.687451/

 

全編英語なので、スレッドのやり取りを掻い摘んで説明すると

スレ主:AliPay SDKを使用してるからって理由でアプリを削除されたんだけど、そんなSDK使ってないよ

 

スレ主:Unity Teamに連絡したらUnityChannelというプラグインにXiaomi SDKがデフォルトで含まれていて、このSDKの中にAlipay SDKが含まれているみたい

 

スレ主:IAP購入サービスを有効にするとこのSDKが含まれてしまうから、UnityChannel.aarを手動で修正するしかないね。

 ということらしい。


この"IAP購入サービス"ってアプリ内課金用のサービスことだと思うのですが、Dull Things No Lifeでは課金処理は実装していません。サービスウィンドウを開いて確認しても In-App Purchasingの欄はOFFになっています。

 

f:id:Karvan:20190507220034p:plain

ん~・・・

 

返信1:Xiaomi Mi Game CenterのSDKが問題だと思います。それらを削除する必要があります。

 

返信2:Build SettingsでXiaomi Mi Game CenterのSDKを追加している?それを削除しましょう。

f:id:Karvan:20190611233326p:plain

 

 返信3:私のアプリも同じ理由でGooglePlayから削除されました。でも、Xiaomi Mi Game CenterのSDKは追加していません。

 

私もBuild Settingsを確認しましたが、Xiaomi Mi Game CenterのSDKは追加していませんでした。(ADDボタンなんて押してない)

 

ただ、後で思い出したのですが Dull Things No Life開発段階でアプリ内課金の実装を検討していて、途中でIn-App PurchasingをONにしていた時期がありました。(現在はOFFにしています)

 

ここで物事が面白くなるところです。

返信4:現在、IAPを使用していなくても、過去に有効にしていた場合はUntiyChannel.aarライブラリは存在し、Alipay SDKがパッケージ化されます。Xiaomi Store SDKが含まれている場合も同様です。

 

!!!

つまり、一度でもIn-App PurchasingをONにしてビルドしている場合は、その後、設定をOFFにしてビルドしてもUntiyChannel.libはデフォルトでパッケージに含まれてしまう=Alipay SDKも含まれる、ということで、なんだそれ。なんの罠だよ。

  

返信4(つづき):現在の回避策は、IAPを使用していない場合はUntiyChannel.libを削除し、Xiaomi Store SDKを追加しないようにすることです。

あ~なるほど、では早速その回避策を試してみましょう。

 

UntiyChannelの削除

プロジェクトのフォルダを確認するとPulginsフォルダの下にUntiyChannelというフォルダがあることが確認できます。

そしてその中にはXiaomi Supportなるディレクトリがあるのがわかります。

f:id:Karvan:20190611234212p:plain


エクスプローラーで確認するとこんな感じ

f:id:Karvan:20190611234243p:plain

 

ちなみにPackageManagerで確認するとUntiyChannelと言う項目は表示されません。

f:id:Karvan:20190611234500p:plain

 

前述のようにDull Things No LifeではIAPを使用しない(アプリ内課金を実装していない)ので、UntiyChannelは不要だと判断して、このフォルダごと削除しました。

 

プロジェクトの再ビルドが掛かりますが、特にエラーがでることはありませんでした。
そのままBuild SettingsからAPKファイルを作成⇒GooglePlayにアップロード。


しばらく経つと、GooglePlayにDull Things No Lifeが再リリースされているのを確認できました。

bit.lyこのリンクでアプリページに飛べるはず

 

今のところ再BANは無い模様

UntiyChannel削除版をGooglePlayにアップロードして3日経過していますが、今のところ再BANされていません。


AdMobの広告も問題なく表示されているので、UntiyChannelを削除する対応で間違っていないようです。

 

ちなみにIAPを使用している場合の回避策も同じ返信の中に書かれています。

返信4(つづき):アプリにIAP Unity Serviceが必要な場合は、Unity側の対応を待ってアップデートするか、IAP Unity Serviceを削除後、プロジェクトをエクスポートしてAndroid StudioのプロジェクトにIAPをネイティブ追加する対応を行ってください。

「Unity側の対応を待つ」とか中々シビアな対応だと思うのですが、ただ、今回の問題ってUntiyを使用している殆どのアプリが対象になるのに、Twitter上で同じような報告が全く上がっていないのが非常に不思議で仕方ありません。

 

それともこれから同様のケースが増えてくのでしょうか?状況を注視していく必要がありますね。

 

【Unity】オブジェクトをHEX(六角形)座標系に沿って並べる

インディゲームイベント・・・って楽しそう

先週末はインディゲームの一大イベント"BitSummit"が京都で開催されたそうで、Twitter等にはイベントの盛況が数多く投稿されていました。

私もいずれはそんな大きなイベントに参加できるようになりたいのですが、現状ではお金も時間もコミュ力もないし、互いをハンドルネームで呼び合う文化にも慣れていないので、今は力を蓄える時期だと考えて頑張りたいと思います。

 

六角形にロマンを感じる

まぁそんなことはさておき、大戦略や三国志等にはまった世代の嗜好として、どんなジャンルのゲーム画面でも継ぎ目の無い綺麗な世界(マップ)を見たときより、六角形のタイルで敷き詰められたマップを目にしたときの方がワクワクするというか、なんとなくロマンを感じます。

 

f:id:Karvan:20190604220037p:plain

こんな感じのマップとか、六角形のタイルが並んでいるだけで面白そうに感じる。

 

なので、次回作ではHEX(六角形)マップを取り入れたゲームにしたい=オブジェクトをHEX(六角形)座標系に沿って並べる必要がある、ということで、HEX(六角形)マップでの座標の計算にチャレンジしてみました。

 

HEX座標を直交座標に変換する

HEXマップの基本的な考えとして、隣接する各HEX同士の距離は必ず等しくなります。

 

f:id:Karvan:20190604220231p:plain

 

ということは、上図の場合だとX方向に並んだHEXはHEXの幅の等間隔で並んでいるのでX方向の座標計算は難しくないですね。

 

ただ、Y方向の座標は三角関数を使って計算する必要があります。
また、Y方向に並んだHEXは互い違いにX方向にズレて並ぶので、そのズレも計算する必要があります。

 

f:id:Karvan:20190604220311p:plain

 

まぁ、高校レベルの数学の知識があれば難しい話しではないのでしょうが、ただ、直交座標系から見えればY方向のHEXはジグザグに並んでいるので、前述したX方向のズレは一つおきに考慮する必要があります。面倒くさい。

 

f:id:Karvan:20190604220419p:plain

 

上図の考えをコーディングするとこんな感じ

 

    /// <summary>
    /// HexGrid座標からローカル座標へ変換
    /// </summary>
    /// <param name="hexPos"> HexGrid座標</param>
    /// <returns>ローカル座標</returns>
    public Vector3 Cal_HexPosToViewLocalPos(Vector2 hexPos)
    {
    	// Y方向高さ
        Hex_Height = Hex_Width * Mathf.Sin(60.0f * Mathf.Deg2Rad);
        
    	// X方向のずれ
        Hex_Adjust = Hex_Width * Mathf.Cos(60.0f * Mathf.Deg2Rad);
        
        float grid_X = Hex_Width * hexPos.x + Hex_Adjust * Mathf.Abs(hexPos.y % 2);
        float grid_Y = Hex_Height * hexPos.y;

        return new Vector3(grid_X, grid_Y, 0.0f);
    }

 

では、実際にこの関数を使って六角形のオブジェクトを並べてみよう。

 

f:id:Karvan:20190604221536g:plain

おお、案外上手くいっている!
あとはコレをどうやってゲームに落とし込むかで。。。

 

 

【Unity】Unity提供アセット「UIWidget」を使ってみよう・・・と思った話

急に暑くなる

5月なのに30度以上の気温になるとか聞いてない。日差しも強いので車を運転していると顔だけが日焼けして鼻とか目の周りが真っ赤になってる皆さんこんにちは。顔を洗っているとヒリヒリして痛いです。

 

さて、当プロジェクトのゲームアプリ「Dull Things No Life」は残念ながらIndie Game FestivalのTop20に選出されなかった為、プレゼンテーション用の資料を作る必要もなくなり、不本意ながらもプロジェクト作業はこれで一段落となります。

 

なのでブログのネタも尽きた状態なのですが、何かしら書こうと色々探していたら、毎度お世話になっている「Unity AssetStoreまとめ」さんで面白そうなアセットが紹介されていました。

 

www.asset-sale.net

で、今回はそのアセットの導入をしてみたお話

 

UIWidgetとは

ここ最近、アプリ系界隈で話題に上がっているフレームワーク「Flutter」


スマホのOS(Android/iOS)に拠らない綺麗なアプリを素早く作るためのクロスプラットフォームSDKなんですが、Unityでそれに類似したワークフローでアプリのUIが作成できるアセットがこの「UIWidget」です。

 

この「UIWidget」の利点は"60fps以上の高効率でレンダリングできること"・・・らしく、Unity標準のuGUIでは重くなりがちだったUIアニメーションを、サクサク軽快に動作させることができる・・・みたいです。

 

ただ、UIWidgetで作成するUI(イメージやボタン)は標準のuGUIのようにEditor画面にてマウスで配置やサイズを変更することは出来ません。全てコーディングで実装する必要があります

 

またコーディング言語はC#を使用しますが、記述式はFlutterで使用するDart言語のような記述となるので、Flutterを使ったことがない方や、Dart言語とか触れたことがない方は最初戸惑って頭を抱える事になるかもしれません(実際、私がそうでした)

 

導入してみよう

「UIWidget」はアセットストアから無料でダウンロードすることができます。

 

アセット内にはSampleシーンが数多く含まれているので、インポート後にそれらを確認して「UIWidget」の色々な動作を確認することができます。

 

今回はSample/ReduxSampleにあるCounter/Appシーンを起動します。

f:id:Karvan:20190528215731p:plain

こんな感じのシーン。

 

実行すると、Addボタンをクリックする度に「Count」とかかれた文字の横の数字がカウントアップしていく簡単なUIとなっています。

 

f:id:Karvan:20190528220010g:plain


このウィンドウを示す赤枠や中央ボタンや「Count」とかかれた数字、これら全てがUIWidgetで実装されているUIです。

 

で、このシーンをHierarchyウィンドウで確認すると・・・

f:id:Karvan:20190528215929p:plain

 

Unity標準のuGUIならCanvas配下にButtonやらTextなどのUIオブジェクトが表示されているはずですが、Canvas配下にはPanelしか無いのがわかります。

 

PanelオブジェクトのInspectorを確認すると・・・

f:id:Karvan:20190528220144p:plain

 

こういう感じになっています。ここにもButton等のComponentはありません。


そう、画面上に表示されているButtonやらTextなどの配置やサイズの情報は全てPanelオブジェクトにアタッチされている「CounterAppSample.cs」の中に記述されているのです。

 

あ~、これは使いづらいわ~

・・・と、ここまで読んで思われた方もいるでしょう。サイズやら位置などの情報がInspectorで確認できなのは確かに使いづらい。

 

ただ、UIWidgetではUIWidgetで作ったUI専用のInspectorが用意されており、そちらでサイズ、位置の情報が確認することができます。

 

Window > UIWidgets > Inspectorを開くと、空白のウィンドウが開くのでその上部タブにある<Please Select>をクリック⇒UIWidgetで作ったUIを選択するとそのUIのいろいろな情報を表示することができます。
(事前にBuild Settings > Player Settings > Player のScripting Define Symbolsに「UIWidgets_DEBUG」を登録する必要があります)

 

f:id:Karvan:20190528220323p:plain

 

ここら辺の話は先程紹介した「Unity AssetStoreまとめ」さん方に詳しく書かれているので、そちらを参考にして下さい。

 

スクリプトでの実装

前述のように「UIWidget」ではUIを全てスクリプトで実装する必要があります。

 

UIの各部品(ButtonやText、イメージ等)はぞれぞれが「Widget」と言う単位で考えられ、このWidgetをツリーのように組み合わせて作ります。

 

今回のサンプルシーンでは赤枠の中にButtonとTextをWidgetとしてツリーのような入れ子にしてレイアウトを組み立てています。
これをソースコードで表すとこんな感じになります。

 

f:id:Karvan:20190528220456p:plain

赤枠(Container) の定義の中にButtonとTextがnewされて利用されおり、ButtonとText各プロパティをその中で記述し配置やサイズを実装します。

また、Button定義の中にはクリックしたときの処理も記述されていることが分かります。

 

難しいですか?そうですよね。

今回は単純なUIでの実装サンプルについての記事なので、これだけではピンと来ない方も多いと思います。


また、記述式も入れ子方式でこれまでとは違う感じなので慣れないと難しいでしょう。(私もそうだし)

 

ただ、既存で用意されているWidgetは豊富でサンプルもそろえられているので、これらを使いこなせば従来より少ないコード量で高速なUIを実装可能に・・・なるかもしれません。

 

また、サンプルシーンにはこんなものもあります。

f:id:Karvan:20190528220845g:plain

ゲーム空間にあるオブジェクトを名前で検索して、赤く色を変える

 

確かに学習コストの高いアセットですが、その分見返りも多いものが得られるアセットではないでしょうか。

 

 

 

【Unity】シンプルだけどお洒落な画面を作りたい:COLOR BOX Shader

長くなるのでいきなり本題

例えばMonument Valleyのような、ローポリでシンプルだけど凄くお洒落な画面を作りたい場合、非常に助けになるアセットが今回紹介する『Color Box - UV Free Unlit Color Gradient Shader』(以下、ColorBox)だと思います。

 

assetstore.unity.com

前回の記事でも紹介したのですが、このシェーダーではテクスチャを必要とせずに3Dモデルに色づけをすることができ、私もUnityroomで公開した『Geometry Drop』でこのシェーダーを使用しています。

 

f:id:Karvan:20190507220033g:plain

 

もちろん、3Dモデルに色をつけるだけなら標準のシェーダー(例えばStandardシェーダー)でもテクスチャ無しで色を指定することは可能です。

 

ですがその場合、3Dモデルの全ての面が一律で塗りつぶされ、シーン内の光源(ライト)の影響によってその濃淡が表現されます。

 

f:id:Karvan:20190521220321p:plain

Standardシェーダーで赤色を設定したCUBE

 

ColorBoxを使用すると光源の影響を受けることなく、自身の指定した濃淡での色づけが可能なため、単に赤一色だとしても3Dモデルをお洒落に表現することがきます。

 

f:id:Karvan:20190521220419p:plain

ColorBoxシェーダーで赤色を設定したCUBE

 

上の図では同じ赤色でも薄い赤を上面に、正面と左面にそれぞれ濃さの違う赤色を指定して、それをフラットに塗りつぶしています。

 

f:id:Karvan:20190521220634p:plain

ColorBoxシェーダーの設定

 

ここで注目してほしいのは「Gradient Space」という項目、これは色付けを行うための座標系を指定する項目です。

 

World座標系による色づけ

ColorBoxシェーダーでは色付けの座標系を

  • World:ワールド座標
  • Object:オブジェクト(のローカル)座標
  • Screen:スクリーン(からの見た目)座標
  • Camera:カメラを起点にした座標

から選んで指定することができます。

 

上記の設定の中ではGradient Spaceの項目がWorldになっています。

これは色付けの方向を「ワールド座標での右(X方向)、上(Y方向)、正面(Z方向)」を指定しています。


この場合、3Dモデルが回転しても色付けの方向は一定(変わらない)なので、その方向からライトを当てたかのような表現になります。

 

f:id:Karvan:20190521221345g:plain

 

上の動画の通り、回転しても色の位置は変わらず、上方向の面が明るい赤、左方向の面が暗い赤、になっていることが分かります。

 

もっと分かりやすくする為に、同じ赤色ではなく各面でそれぞれ違う色を指定した場合の動画も作ってみました。

 

f:id:Karvan:20190521221512g:plain

こんな感じ、World座標系指定を指定すると、3Dモデルの向きに関係なく色付けが行われることが分かります。

 

では、3Dモデル自体に色付けをしたい場合はどうするのでしょうか。

 

Object座標系を指定した場合

その場合は、Gradient Spaceに「Object」を指定します。

 

Object座標系を指定した場合は、対象となる3Dモデルを基準としたローカル座標での方向指定となるので、モデルの指定した面に色付けが固定されます

 

先程と同じ色指定でGradient Spaceの項目だけを「Object」に変更すると、

 

f:id:Karvan:20190521223004g:plain

こんな感じになります。


各面に指定した色が固定されるため、当然、3Dモデルが回転しても各面の色が変わることがありません。

 

f:id:Karvan:20190521223104p:plain

ColorBoxシェーダーの設定

 

Screen座標系を指定するケース

Screen座標系の指定は一見するとWorld座標系を指定した場合と大きく変わることが無いかもしれません。

 

ただ、複数の3Dモデルを並べて、それらを(スクリーン上)一律にグラデーションを掛けたい場合、この座標系指定が役に立ちます

 

具体的には奥行き方向に並んでいる3Dモデルに対して、手前の3Dモデルは明るく、奥にいくほど暗い色で表現したい場合、わざわざマテリアルを分けたり、色を変えたりすること無く、一つのマテリアルで実現することができます。

 

f:id:Karvan:20190521223416p:plain

 

こんな感じ。並んでいるオブジェクトは全て同じマテリアルを使用しています。

 

ColorBoxシェーダーの設定は以下のように行います。

上方向(Top Color)のグラデーション設定でStartで暗めの色、Endで明るめの色を指定しているのに注目してください。

 

f:id:Karvan:20190521223502p:plain

 

この他にも色んな機能がある

今回は色付け座標系の機能について紹介しましたが、ColorBoxシェーダーには他にも

  • 塗りつぶし方法を「単色」か「グラデーション」か指定可能
  • グラデーションの塗りつぶしの回転
  • グラデーション位置のコントロール
  • アウトラインの表示

等々の機能があり、一回の記事では紹介しきれません。

 

また、最初に「光源の影響を受けることなく」と書きましたが、Receive / Cast Shadowの指定やライトマップのサポートも可能なので使い勝手は非常に良いと思います。お洒落な画面作りにはもってこいですね。

 

あとは使う人間のセンス次第ということで・・・

 

【Unity】Geometry Dropで使用したアセットの紹介

北海道

10連休が明け、久しぶりに会社の机についてPCを起動させながら、メールが一件も着ていないことを願っていた皆さんこんにちは。私はそんな小さな願いも叶えてくれない神様に絶望です。

 

まぁ、連休中に呼び出しの電話が掛かってこなかっただけでも良しとしよう。。。

 

そんなこんなでGW10連休明けは本業がバタバタしていたのですが、にも関わらず今週末は札幌まで旅行してきました。

 

f:id:Karvan:20190514215415j:plain

 

お目当ては好きなアーティストのコンサートを観戦するためで、旅行といっても日曜の早朝に出発して月曜の早朝に帰る、という弾丸旅行、観光と言う観光は殆ど出来なかったのですが、とりあえずラーメンとスープカレーは食べました。

 

そして、五月だというのに最高気温が14℃という寒さにビックリした旅行でした。どうもありがとう。

 

f:id:Karvan:20190514215607j:plain

早朝の新千歳空港

 

小休止状態

Unityによるゲーム開発のほうですが「Dull Things No Life」の開発も終わり、Room6ゲームジャムへの投稿も終えたばかりなので、現在は次回作の構想を練っているというか、小休止している状態、ゲーム開発より隻腕の忍者を操っている時間のほうが長い状態だったりします。

bit.ly

apple.co

 

まぁ来週あたりからプロトタイプの製作にでも取り掛かろうかな、とは考えていますが、なにせ梟とかいうデカイ忍者に足止めを食らっている現状なので、まずはそれを突破することを最優先にするかもしれない。。。さぼり癖が付く前に片付けたいところですが。

 

とはいえ、何も記事を更新しないのは忍びないので、Room6ゲームジャムへの投稿作品「Geometry Drop」で使用したアセットの紹介でもしたいと思います。

 

unityroom.com

「Geometry Drop」はunityroomで公開されているので、PCなら誰でも遊べます。
時間つぶしに遊んでみてください。

 

アセットの紹介

  • Color Box Shader

assetstore.unity.com

テクスチャを使用せずに、3Dモデルに色づけができるシェーダ。
6方向(前後左右上下)から「単色」もしくは「グラデーション」でモデルの色をつけることが出来ます。

 

毎度お世話になっているUnityAssetStoreまとめの記事でも詳しく紹介されています。

www.asset-sale.net

このシェーダについては次回にでも記事にしたいと思います。

 

  • DoTween Pro

assetstore.unity.com

おなじみのTween系アセット。無料版もあるのですがTextMeshProと組み合わせて使いたい場合は有料版が必要です。
今回の場合カメラがホールの中を通過させるために、このアセットのPath指定による移動処理を使用しています。

 

  • Hyperbit Arsenal

assetstore.unity.com

「Hyperbit」という名前が付くだけあって、ボクセル系のデジタリックなパーティクルが多いです。
ブロックがぶつかった際のパーティクルとか、加速している時のパーティクル等に使用しています。

 

  • 3D UI Elements

assetstore.unity.com

星型、ハート型のブロックとホールはこのアセットのモデルです。
他にもアイコンとして使える3Dモデルが数多く収録されています。

 

  • proPrototype Collection

assetstore.unity.com

六角錐やら三角型のホールやら主にゲームのプロトタイプを作る際に使用するモデルが収録されています。

 

こんなもんでしょうか。「Dull Things No Life」に比べて製作期間も内容も軽いゲームなので使用アセットも少ないですね。

 

 

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。