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

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

【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」に比べて製作期間も内容も軽いゲームなので使用アセットも少ないですね。

 

 

 

【Unity】Room6ゲームジャムに参加した話

GW終了

GW最終日に洋服を買いに行ったら顔なじみの店員に「GWは何処かに行かれたんですか?」と聞かれたので、咄嗟に「あ~、アチコチ行ってましたね、温泉とか」とありもしない旅行話を創作した皆さん、こんにちは。

 

元号も「令和」に変わり心機一転、私も新しい自分に生まれ変われるような気分でGWに突入したものの、結局気分だけで実体が伴わなかった為、くだらい見栄を張りました。ごめんなさい。実際は9割がた部屋でゲーム作ってた。

 

というのも・・・

前回の記事でも紹介したのですがゲーム会社「Room6」によりゲームジャムの企画が行われていたので、GW期間中はそのイベント参加用のゲームを作っていました。

 

出来たゲームはこちら

unityroom.com

落下する幾何学図形のモデルを左右キーで移動させます。

同じ色のブロックを壊すことができ、同じ形状のホールを通過することができます。

スコアが15,000点に達したらクリアです。

結構簡単なゲームだと思うので是非遊んでください(PCのみです)。

 

f:id:Karvan:20190507214406g:plain

 

動画のとおり画面も操作も非常にシンプルな造りとなっています。
GW前の構想段階では「3日もあればできるかも」とか考えていたのですが、実際に投稿したのは締め切りギリギリになってしまいました。

 

「15,000点に達したらクリア」という仕様にしたのも製作の遅れからステージ制を断念、ハイスコア管理も実装が時間的に間に合わなかった結果によるもので、意外と締め切りに追われる作業スケジュールとなってしまいました。

 

f:id:Karvan:20190507214835p:plain

最後の方はこんな気分

 

製作過程を振り返ってみよう

なので今回は反省の意味をこめて、GW期間中の製作過程を振り返ってみようと思います。

 

4/27,28

GW前にゲームジャムの情報を知った為、頭の中である程度ゲームの仕様(落下するオブジェクトを操作する)を固めた状態で作業に取り掛かる。

 

細かい部分は実装しながら詰めていけばいいやーとか思っていたが、そもそも「Player側を落下させるか、Block側を上昇させる(相対的に落下しているように見せる)か」という根本的な造りに悩み、あれこれ試作を繰り返して時間を浪費する。

f:id:Karvan:20190507220034p:plain

 

4/29,30

落下動作はUnityの物理演算に任せればいいやーとか思っていたが、物理演算による挙動とPlayer側のキー操作による動作が上手く整合が取れず、結局物理演算をあきらめて落下動作も自分で制御することにする。あー面倒くさい。

f:id:Karvan:20190507220034p:plain

 

加えて3列横並びに並べていたBlockを円周上に配置するように変更、それに伴いPlayer側のキー操作も変更する必要になった。面倒くさい、面倒くさい。

 

GWも4日過ぎて未だ試行錯誤の状態、完成する気が0になる

f:id:Karvan:20190507220439p:plain

 

5/1

GW前に偶々チケットが取れて予定していたナナヲアカリのライブに参戦。

気分転換もかねてゲーム制作は休止する。

ライブではしゃぎすぎて腰を痛める。そして「ダ、ダ、ダ、ダメ天使は~♪」のフレーズが耳から離れなくなる。

 

5/2,3

気分を入れ替えて作業を進めた結果、やっとゲームの形になる。そしてゲームがあまりにシンプルで単調だということに気づく。

なのでホール通過時にカメラもホールを通過させたり、落下速度が速くなるにつれてカメラの角度を変えたりと、単調さをゴマかす演出を試行錯誤する。あと、ライブで歌われた曲の中で気に入ったナヲアカリの曲をダウンロード購入する。

 

5/4

パーティクルやらSEやらをつける作業を開始。もしかして間に合わないかも・・・という考えが再度頭をよぎるが、「やんないじゃない、できないんだ!ドヤッ」というナナヲアカリのフレーズに勇気付けられながら、開き直りの精神で作業をすすめる。

 

5/5

タイトルロゴを作成し、スタートからゲーム開始までの流れを作る。

そして前述のようにステージ制を断念、ハイスコアの管理とか何それ美味しいの?状態になったので、「15,000点に達したらクリア」と言う強引過ぎる仕様に変更する。

そしてナナヲアカリ氏のTwitterアカウントを発見してフォローする。

 

5/6

23時の締め切りに間に合わせるためにゲームオーバーの処理やらエンディングやらをやっつけで作成する。

当然のことながらレベルデザインとかバランス調整とか殆どできずにクオリティに不安になるが、きっと主人公補正とか掛かっているから大丈夫、最近よく思うようになったんだ。なんとなくすごく!(『ハッピーになりたい』 by ナナヲアカリ)、みたいな気分で乗り切ってunityroomへ投稿、何とか締め切りに間に合う。

f:id:Karvan:20190507221319p:plain

ありがとう、ナナヲアカリ

 

ゲームジャムに参加した感想

何故か後半はナナヲアカリ日記みたいになりましたが、この期間を振り返ってみて一番に思うことは、締め切りに間に合う事が出来て良かったということと、自身のゲームを仕上げるノウハウの無さを再認識した、ということでしょうか。

構想段階ではアレコレ演出やら機能ならを考えていたのですが、そのうちの3割ぐらいしかゲームに実装できなかった気がします。それに「ゲームの面白さ」部分に関しての掘り下げが甘かったなぁ、と反省しています。

unityroomでは今回の企画と似たような「一週間ゲームジャム」といったイベントがあるので、また機会があれば短期集中型のゲーム開発に挑戦してみたいですね。

 

 

 

 

 

 

 

【Unity】Unity2019.1にアップデートしたらTextMeshでエラーがでた(定期)

10連休が待っている

GW10連休が間近と言うことで早くも休み気分で本業をこなしている今日この頃。
まぁ10連休とはいえ、どこかに旅行に行くとか、友達と飲み会をするとか、彼女とデートをするとか、そんなリア充な生活とは無縁なので、ほとんど自室の中で過ごすとは思うのですが、そんな私にピッタリの企画を発見

 

room6GameJam

www.room6.net

 

ゲーム会社「room6」の企画でGW期間中にゲームを作ってunityroomへアップすると言うイベント。


オープン参加らしいので気軽に参加できますし、なにかしらの賞品も出るようです。暇つぶしにがんばろう。

 

そんなこんなでバージョンアップ

AdMobのアカウント停止がようやく解除されたので、それにともなって「Dull Things No Life」のバージョンアップを行いました。
新ステージと新ギミック(障害物)の追加です。

 

Grid

f:id:Karvan:20190420212935g:plain

近づくと網目のように壁が隆起します。その間を潜るのですが、網目の中にはレーザの梁があるのでジャンプしてかわします。

 

Roulette

f:id:Karvan:20190420213234g:plain

番号をランダムで決定します。番号に応じたドアが開くのでその下をスライディングで潜って前へ進みます。

 

新ステージは5ステージ追加で上記の新ギミックが登場します。是非ダウンロードして遊んでください。

 

bit.ly

apple.co

Unity2019.1にアップデート

「Dull Things No Life」の開発もこれで一段落ついたので、Unityを2018から2019へアップデートすることにしました。

 

Unity2019へのアップデート通知は以前から受けていたのですが、なにせ今までアップデートをする度に何かしらエラーが発生し、その度に対処で時間がとられる、という苦い経験をしてきたので「Dull Things No Life」のバージョンアップが終わるまでは保留にしていたんです。

 

で、このたびアップデートしてみたら案の定、コンソールにこのエラーが・・・

 

C:/Users/・・・・・・/Library/PackageCache/com.unity.textmeshpro@2.0.0/Scripts/Runtime/TMPro_UGUI_Private.cs(1865,73): error CS1644: Feature out variable declaration cannot be used because it is not part of the C# language specification

 

f:id:Karvan:20190116001150p:plain

何度目だ(ほぼ定期だな)

 

最初はLibraryにあるtextmeshpro関連のファイルを消してみたのですが、Unityを再起動すると消したはずのファイルが復活して同じエラーが表示、思い切ってPackageCacheごと消してみても状況は変わらずエラーは消えませんでした。

 

Google先生に尋ねて色々調べるとC#のRuntimeVersionが.NET3.5になっているのが原因らしい。
なので、RuntimeVersionを.NET4.xに戻すとエラーが消えて問題なく動作しました。

 

RuntimeVersionを変更する場合はProject Setting>Player>OtherSettingsを選んでConfigurationにある『Scripting Runtime Version』で『.NET4.x Equivalent』を選択します。

 

f:id:Karvan:20190423215648p:plain

 

そんな設定が必要なんですね。知りませんでした。

 

f:id:Karvan:20190116001258p:plain

なんせ前バージョンではちゃんと動いていたんですからね!

(これもほぼ定期)

 

【Unity】(小ネタ)OSの言語を取得してURL表示先を変える

つい先日のことですが、実家で飼っていた猫が息を引き取りました。

 

19歳という、猫としては高齢だったので寿命といえば寿命なんですが、やはり長く生活を共にしていた存在が突然いなくなると、その喪失感は大きいですね。

 

思い出すと辛くなったりするのですが、とはいえ後ろばかりを振り返ってはいられないので、今回も元気はないけど記事を更新します。

 

バージョンアップ版テスト中

GoogleAdMobのアカウント停止がもうすぐ解除されそうなので、それに伴ってDull Things No Lifeのバージョンアップを行っています。

 

現在は追加した新しいギミック(障害物)と新ステージのテスト中です。


新ギミックについては次回の記事で紹介したいし、アプリ自体はAdMobのアカウント停止があける位にリリースすべく頑張っています。

 

f:id:Karvan:20190219221455j:plain

 

このDull Things No Lifeでは操作方法やギミック(障害物)を紹介するページを用意していて、GoolgePlayやAppleStoreのアプリ詳細にリンクを貼っています。英語版も作成しているのでアメリカやらの英語圏では英語版のページにリンクが貼られています。

 

で、よく考えるとアプリ内では一応、最初の3ステージはチュートリアル的な位置付けで操作方法が表示されるようにしているのですが、それだけでは少し不親切だと感じていたので今回のバージョンアップに伴って、アプリ内から上記の紹介ページが表示されるように改修しました。

 

ただ、紹介ページは日本語版と英語版の二つあるので言語環境に応じてURL表示先を変える必要がありました。

 

といわけで実装

アプリが実行されている言語環境を取得するには、ApplicationクラスのsystemLanguageプロパティを参照すれば可能です。

 

string deviceLanguage = Application.systemLanguage.ToString();

 

日本語の場合は"Japanese"が返却され、英語の場合は"English"となります。
URLを指定してブラウザを開くにはApplicationクラスのOpenURLを使用すればよいので、systemLanguageプロパティを判定してURLを設定⇒OpenURLで表示、となります。

 

string url_jp = "日本語のURL";
string url_en = "英語のURL";

string deviceLanguage = Application.systemLanguage.ToString();

if(deviceLanguage == "Japanese"){
	Application.OpenURL(url_jp);
} else {
	Application.OpenURL(url_en);
}

 

今回は小ネタでしたね。まぁ、いつも高度な記事を書いているわけではありませんが。

 

 

 

◇プライバシーポリシー

●個人情報の利用目的

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

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

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

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

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

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

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

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

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

●免責事項

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

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

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

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

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

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