(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

Hierarchy上で選択しているGameObjectを固定する【Unity】【エディタ拡張】


この記事でのバージョン
Unity 2018.4.6f1


はじめに

今回はHierarchy上で選択しているGameObjectを固定する

言い換えると、一つのオブジェクト以外選択できないようにするというトリッキーな話です。


イメージとしては以下のような感じ。

f:id:kan_kikuchi:20190817045105g:plain


なお、Inspectorの表示を固定したいだけなら、右上のロック機能を使った方が早いです。

f:id:kan_kikuchi:20190817045147j:plain



SelectedGameObjectFixer

続きを読む

可変する数字を画像(Sprite)を使って、SpriteRendererやImageで表示【Unity】【uGUI】

この記事でのバージョン
Unity 2018.4.6f1


はじめに

Unityで数字を表示する時はuGUIのTextを使うのが一般的ですが、

「フォントを使わずに可変する数字を画像で表示したい!」

「SpriteRendererで可変する数字を表示したい!」みたいな事がたまにあります。


という事で今回はフォントを使わず、以下のような数字の画像(Sprite)を使って

f:id:kan_kikuchi:20190912073536j:plain


SpriteRendererやImageで任意の数字を表示するプログラムの紹介です!

f:id:kan_kikuchi:20190912075702g:plain


なお、記事中の例では数字の画像をバラバラの状態で使っていますが、

実際に使用する際はSpriteAtlasなどでまとめる事をオススメします。(負荷が下がるので)





SpriteNo

続きを読む

サーバーサイド不要&無料でゲーム内のデータをリモートで変更出来るUnity公式の機能 Remote Config 【Unity】【Unity Services】

この記事でのバージョン
Unity 2018.4.6f1


はじめに

以前、ブラウザ上で設定したデータを、プログラムで簡単に取得出来る

Remote SettingsというUnityサービスの機能を紹介したのですが、

f:id:kan_kikuchi:20190827062021g:plain


その際に同系統のRemote Configという機能(やっぱり無料!)を教えてもらったので、

今回はそれを試してみた感じの記事です!



イメージとしては以下のような感じで、Remote Settingsと同じような事が出来ます

Remote Settingsと違い、ブラウザでの操作が必要なく、Unityエディタ上で完結するみたいでした。

f:id:kan_kikuchi:20190908045625g:plain


なお、Unity Remote Configを使えるのは、Unity2018.3以降です。

また、プレビュー版なので、今後大きな変更が加わる可能性がある点には注意が必要です。


導入

続きを読む

ScriptableObjectなどのアセットを、metaファイルを変更せずに上書きする 【Unity】【エディタ拡張】


この記事でのバージョン
Unity 2018.4.6f1


はじめに

UnityではAssetDatabaseのCreateAssetを使うことで、アセットを簡単に生成する事が出来ます。

//ScriptableObjectChildというScriptableObjectを作成
var child = ScriptableObject.CreateInstance<ScriptableObjectChild> ();

//ScriptableObjectをアセットとして生成
string exportPath = "Assets/ScriptableObjects/Chid.asset";
AssetDatabase.CreateAsset(child, exportPath);

Debug.Log(exportPath + "生成");
f:id:kan_kikuchi:20190901075412j:plain


このCreateAsset、もし生成先に既にアセットがある場合は上書きで保存するのですが、

その際に当然ですがmetaファイルも上書きされます。


基本的にはそれで問題ないのですが、以下のようにどこかで参照されているものを上書きしてしまうと

参照がなくなってMissingと表示されるようになってしまいます。

///ScriptableObjectChildを参照しているScriptableObject
public class ScriptableObjectParent : ScriptableObject {
  
  [SerializeField]
  private ScriptableObjectChild _child = null;
  
}
f:id:kan_kikuchi:20190901092349g:plain


参照を維持したままファイルを更新したい場合は、metaファイルをそのままにすればいいのですが、

残念ならがらUnityにはそういう機能がないようです。(もしある場合はご一報頂けると幸いです……!)


という事で今回は

ScriptableObjectなどをmetaファイルを変更せずに上書きする処理を作ってみました!


CreateAssetWithOverwrite

続きを読む

サーバーサイド不要&無料でゲーム内のデータをリモートで変更出来るUnity公式の機能 Remote Settings【Unity】【Unity Services】

この記事でのバージョン
Unity 2018.4.6f1


はじめに

Unityはエディタだけでなく、Unity AdsUnity Analyticsなどの




便利なサービスをUnity Servicesという形で提供しています。

Unity は、ゲーム開発はもとより、オーディエンスをひきつけ、維持し、収益につなげるさまざまな無料サービスを提供しています。


そんなUnity Servicesの中(のUnity Analyticsの中)にRemote Settingsというサービスがある事を

以下の動画で知ったので、試してみて、導入や使い方をまとめてみました!



イメージとしては以下のような感じで、

ブラウザ上で設定したデータを、プログラムで簡単に取得出来るといったもの。

f:id:kan_kikuchi:20190827062021g:plain


もちろん、サーバーサイドの準備や実装は必要ありませんし、

無料で使う事が出来ます!(これ以上使ったら有料みたいなのもなし)


残念ながらゲーム側からデータを送る事は出来ませんが、それでも

ゲームバランスに関わる値の調整、ゲーム内イベントのデータやフラグ管理、広告の配信比率

など、様々な用途に使えるので、覚えておいて損はないと思います。


導入(ブラウザ編)

続きを読む

Easy Saveを使ってるうちに遭遇するかもしれない、いくつかのエラーとその対処法【Unity】【アセット】【Easy Save】【トラブルシューティング】

この記事でのバージョン
Unity 2018.4.4f1
Easy Save 3.1.3


はじめに

以前、簡単にセーブ&ロード&暗号化が実装できるEasy Saveというアセットを紹介しました。

//セーブ
ES3.Save<int>      ("IntKey",       100);
ES3.Save<bool>     ("BoolKey",      false);
ES3.Save<string>   ("StingKey",     "Text");
ES3.Save<Transform>("TransformKey", transform);

//ロード
int    num  = ES3.Load<int>   ("IntKey");
bool   flag = ES3.Load<bool>  ("BoolKey");
string text = ES3.Load<string>("StingKey");
ES3.LoadInto<Transform>("TransformKey", transform);


今回はこのEasy Saveを使ってるうちに遭遇するかもしれない、いくつかのエラーとその対処法

についてまとめた感じの記事です!



なお、現状Easy SaveはES2とES3がありますが、ES3の話ですのであしからず。

(ES2でも同様のエラーが出る、同じ対処法で直るという事もあるかもしれません)


目次

  • はじめに
  • 目次
  • 保存されていないデータのロード
  • セーブ時とロード時で型が違う
  • 暗号化前後のデータ
  • Easy Save 3 Managerのロードタイミング


保存されていないデータのロード

続きを読む

Unity上でアニメーションの編集や新規作成が出来る Very Animation【Unity】【アセット】

この記事でのバージョン
Unity 2018.4.6f1


はじめに

今回はUnity上でアニメーションの編集や新規作成が出来るVery Animationというアセットの紹介です!

f:id:kan_kikuchi:20190819112339g:plain


以下のようなちょっとしたポーズなら簡単に作ることが出来ますし、

凝ったものでも効率よく作成が可能です。また、既存アニメーションの編集も楽に行えます。

f:id:kan_kikuchi:20190820054522g:plain


ちなみに日本語字幕付き動画チュートリアルが豊富なのもオススメポイントの一つです!

f:id:kan_kikuchi:20190818050936j:plain
f:id:kan_kikuchi:20190818051224j:plain

Very Animation - YouTube


なお、記事中の3Dモデルは以下のアセットを使っております。





基本的な使い方

続きを読む

Hierarchy上の非アクティブなオブジェクトを検索し、取得する方法【Unity】

この記事でのバージョン
Unity 2018.4.4f1


はじめに

GameObject.Findを使うとHierarchy上のオブジェクトを名前で検索する事ができますが、

(子に配置されているものだったら、transform.Findでも可)

//Targetという名前のGameObjectを検索し、取得(なければnull)
Debug.Log(GameObject.Find("Target"));
f:id:kan_kikuchi:20190810053030j:plain


残念ながら、アクティブじゃないオブジェクトは検索できません。

f:id:kan_kikuchi:20190810053122j:plain


という事で今回は、Hierarchy上の非アクティブなオブジェクトを検索し、取得する方法の紹介です!


なお、GameObject.Findしかり、こういう検索系の処理は重いので、

使い所を(出来るなら使わない方向で)考える必要がある点には注意が必要です。


FindObjectsOfTypeAll

続きを読む

Unity公式の2D用のライト Light2D【Unity】

この記事でのバージョン
Unity 2019.2.0f1


はじめに

以前にUnityの3D用ライトを2Dで使う方法や、

f:id:kan_kikuchi:20170816184902j:plain


2Dで光や影の表現をするためのアセットを紹介しました。

f:id:kan_kikuchi:20170816124630g:plain


これらはUnityで2D用のライトが存在しないからこその話だったのですが、

なんとついにUnity公式の2D用のライトであるLight2Dが登場しました。


という事で今回は、そのUnityの2D用ライトを実際に試してみた感じの記事です。

イメージとしては以下のような感じで、使い勝手も良く、表現力もかなり高そうでした。

f:id:kan_kikuchi:20190815111624g:plain


ちなみに、この機能はUnity2019.2以降で使えますが、現状Experimental(実験的)な機能なので、

今後大きく仕様が変わる可能性もある点には注意が必要です。

(個人的には実用にはまだちょっと早いと思っています。)


なお、記事中の画像は以下のアセットを使っております。





導入

続きを読む

スクリーンのスリープ設定【Unity】

この記事でのバージョン
Unity 2018.4.4f1


はじめに

今回は「Unityで作ったアプリを起動してると、自動スリープしない!させたい!」

みたいな場合の話です!


Screen.sleepTimeout

Unityでスクリーンのスリープ設定を変更する時はScreenのsleepTimeoutを使います。



このsleepTimeoutにSleepTimeout.SystemSettingを設定すれば、

端末で設定された時間でスリープするようになります。

//端末で設定された時間でスリープするように
Screen.sleepTimeout = SleepTimeout.SystemSetting;


例えばiOSなら、設定の「画面表示と明るさ」にある「自動ロック」の時間でスリープします。

(OSのバージョンによっては場所が違うかもしれません)

f:id:kan_kikuchi:20190806081400j:plain

f:id:kan_kikuchi:20190806081408j:plain


なお、スリープしないようにしたい場合はSleepTimeout.NeverSleepを設定します。

(デフォルトはこの設定)

//スクリーンがスリープしないようにする
Screen.sleepTimeout = SleepTimeout.NeverSleep;


ちなみにScreen.sleepTimeoutはintですが、スリープしたい時間を設定したりは出来ません。

//10秒でスクリーンをスリープさせたつもり!
//でも実際はSleepTimeout.NeverSleep(-1)の設定に
Screen.sleepTimeout = 10;