久々に PUN を使ったお話。
ドキュメントを読みながら組めば簡単に作れたよ、ぐらいのお話なので、
かつてのように PUN の深堀をしたわけではないですー。
【Unity】新入力システム Input System を使ってみたよ
今回はUnityの新しくなった Input System を使ってみたお話。
「とりあえず使った」ぐらいの精度なので、プロパティの各動作などを詳しく調査はしていません。
Input System ってこういうものかぐらいの感覚でお楽しみください。
【Unity】PingPong()を使って往復する値の処理を作りたい
Unity にはたくさんライブラリ関数があるから助かるなぁ。
そんな中で、 Mathf.PingPong()
は使ったことがない関数。
これを使って往復移動する処理を使ってみたお話。
【Unity】UnityHubをインストールして使ってみよう
UnityHubのインストール方法と使い方を簡単にまとめてみた話。
僕個人は以前からUnityHubを使ってUnityの管理をしているよ。
今回、個人のプロジェクトのチームメンバーにもUnityHubを使ってほしいので簡単にまとめてみたよ。
そのため、「分からないところがあったら直接に僕に聞いてくれ!」
ぐらいの感じでこの記事を書いているので、結構内容は荒いので注意してね!
まず"UnityHub"とはなんぞや
Unityで開発しているプロジェクトがいっぱいあると管理するのが大変!
Unityエディタも結構な頻度でバージョンが更新されるので、エディタの管理が大変!
UnityHubを使えば、そのあたりのことがまとまって楽よ!
的なものかな。
docs.unity3d.com
ではダウンロードだ
というわけでUnityHubを公式HPからダウンロードしましょうか。
最近は、ダイソンやニトリなどのサイトからも見られる偽サイトも多いから注意しよう。
ちゃんと URL がunity3d.comなことを確認しようね。
unity3d.com
そしたらインストールだ
ダウンロードが出来たら、早速インストールだ!
Unity公式ドキュメントを見ながらインストールしてみましょうか。
docs.unity3d.com
Macの場合は、ダウンロードしたUnityHubをApplicationフォルダに入れちゃうだけでOK。
UnityHubの中にはUnityエディタが入っているわけではないよ。
別途、UnityHubからUnityエディタをダウンロードし、インストールする必要があります。
まずは、歯車アイコンからUnityエディタをインストールするフォルダを決めてから、
インストールタブからUnityエディタをインストールしていこうー。
Unityエディタのバージョンやモジュールは、各プロジェクトに合わせて選択してくださいねー。
チームで作業している場合は、開発環境を管理している方に聞いてみましょう。
エディタのバージョンが異なると、他の人のプロジェクトと動作や出来ることが異なっちゃうので注意!
個人の場合ご自由に。
モジュールは、Win,MacやWebGLがあれば、とりあえずビルドできるし、モバイルもするんだったらiOS, Androidを追加しておけば大丈夫かな。
あとはダウンロード、インストールが終わるまで大人しく待ってよう。
ちょっとだけ使ってみよう
Unityエディタのインストールが完了したらプロジェクトを作ってみましょうか。
UnityHubから作成されたプロジェクトはリストに登録されます。
複数プロジェクトがあってもこのリストに表示されるので、プロジェクトの管理が楽になりますね。
既に別途でPCの中にUnityプロジェクトがある場合は、リストに追加ボタンをおして登録することでUnityHubのリストに登録されますよ。
Unityエディタは複数のバージョンをインストールできます。
複数のバージョンのUnityエディタがある場合は、プロジェクトをどのバージョンで立ち上げるかを選択できるぞ。
もう使わなくなったUnityエディタのバージョンが出てきたら、UnityHubからアンインストールもできる。
ざっと簡単に説明しましたが、このあたりの機能が使えればUnityHubを大まかには使えるじゃないかなぁと思います。
というわけで、UnityHubを七兆回ほど使ってみてくださいね。
【Unity】ランタイム中にのみ値が変更できなくなるアトリビュートを作ってみよう!
シリアライズされた変数が Inspector 上に表示されるけど値の変更が出来ないアトリビュートと、
ランタイム中のみ値の変更が出来ないアトリビュートを作った話。
この記事にはUnity2020.1.14f1を使用しています。
コンポーネントのシリアライズされた変数は Inspector 上に表示されて、値を変更することができるよね。
ランタイム中には現状の値が表示されているので、値の変化を確認することだってできる。
そのため、ランタイム中の値の変化を見たい場合は、変数をシリアライズしておけば、 Inspector 上で見れて便利。
でも、”値を見る”ためにシリアライズした変数を Inspector 上で変更できるようになっているのは、あんまり良くないなぁ。
ちょっと一手間加えてみましょうー。
Disable するアトリビュートを作る
わざわざ各コンポーネント用のエディタ拡張するのはめんどうくさい……。
やりたいことはそんなに複雑ではないと思うので、”アトリビュート”として作っていろんなところで汎用的に使えるものを作ってみましょう!
まずは DisableAttribute
という特に何もしないアトリビュートを作ってみましょうか。
DisableAttribute.cs
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif // UNITY_EDITOR public class DisableAttribute : PropertyAttribute { } // // class DisableAttribute #if UNITY_EDITOR [CustomPropertyDrawer(typeof(DisableAttribute))] public class DisableDrawer : PropertyDrawer { public override void OnGUI(Rect aPosition, SerializedProperty aProperty, GUIContent aLabel) { EditorGUI.PropertyField(aPosition, aProperty, aLabel, true); } } // class DisableDrawer #endif // UNITY_EDITOR
これに Inspector 上ではプロパティを変更できなくするための処理を加えていきましょう。
その処理は既に Unity 側で用意してくれているよ。
BeginDisabledGroup()
と EndDisabledGroup()
だ。
この関数の間に描画されたプロパティは "Disable" 状態になり、値が変更が出来なくなるってしろものさー!
docs.unity3d.com
docs.unity3d.com
早速使ってみよう!
DisableAttribute.cs
#if UNITY_EDITOR [CustomPropertyDrawer(typeof(DisableAttribute))] public class DisableDrawer : PropertyDrawer { public override void OnGUI(Rect aPosition, SerializedProperty aProperty, GUIContent aLabel) { EditorGUI.BeginDisabledGroup(true); EditorGUI.PropertyField(aPosition, aProperty, aLabel, true); EditorGUI.EndDisabledGroup(); } } // class DisableDrawer #endif // UNITY_EDITOR
これで DisableAttribute
クラスが完成したぞ!
サンプルのコンポーネントを作って、動作を確認してみよう!
Sample.cs
using UnityEngine; public class Sample : MonoBehaviour { [SerializeField] private string m_parameterA = "default"; [SerializeField, Disable] private string m_parameterB = "default"; } // // class Sample
DisableAttribute
が設定されている変数は Inspector 上で値を変更できなくなっている。
成功ですねー!
ランタイム中のみ Disable するアトリビュートを作る
もう一手間加えたアトリビュートも作ってみましょうか。
先ほど作った DisableAttribute
は Inspector 上では一切値が変更出来ないので、スクリプト上でしか値を設定することが出来ないよね。
でも、初期値だけは Inspector 上で設定したい、ゲームが実行しているときは値を見るだけ、そんな風にアトリビュートを改良出来ないかな?
先ほど使った BeginDisabledGroup()
は、
引数として渡す値が true
なら "Disable" 状態、 false
なら "Disableにはならない"。
すなわち、"現在ゲームが動いているか?"を判定したフラグを渡してあげれば、望んだ形にアトリビュートを改良できるはずだ!
現在ゲームが動いているかを判定するものも Unity 側で用意されているぞ!
EditorApplication.isPlaying
だ!
ゲーム実行中にはこのプロパティが true になっているよ。
docs.unity3d.com
このプロパティを使う形で 'DisableAttribute' を改良した RuntimeDisableAttribute
を作ってみよう!
RuntimeDisableAttribute.cs
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif // UNITY_EDITOR public class RuntimeDisableAttribute : PropertyAttribute { } // // class RuntimeDisableAttribute #if UNITY_EDITOR [CustomPropertyDrawer(typeof(RuntimeDisableAttribute))] public class RuntimeDisableDrawer : PropertyDrawer { public override void OnGUI(Rect aPosition, SerializedProperty aProperty, GUIContent aLabel) { EditorGUI.BeginDisabledGroup(EditorApplication.isPlaying); EditorGUI.PropertyField(aPosition, aProperty, aLabel, true); EditorGUI.EndDisabledGroup(); } } // class RuntimeDisableDrawer #endif // UNITY_EDITOR
'DisableAttribute' の BeginDisabledGroup()
で渡す値だけを変えた簡単もの。
さっそくサンプル用のコンポーネントで試してみよう!
Sample.cs
using UnityEngine; public class Sample : MonoBehaviour { [SerializeField] private string m_parameterA = "default"; [SerializeField, Disable] private string m_parameterB = "default"; [SerializeField, RuntimeDisable] private string m_parameterC = "default"; } // // class Sample
ゲーム実行中には "Disable" 状態になっているね!
ただ、気になる点がある。
Unity の再生ボタンを押してしばらくの間、まだ "Disable" 状態になっていないのだ!
どうやら Unity のゲーム実行ステートは、
- ゲームを実行していない
- ゲームを実行ステートに移行中
- ゲームを実行中
と、段階を踏んでゲームを実行中となっているようだ。
ただ、こちらからすれば
「再生ボタンを押したらゲームを実行するんだから、すぐにでも "Disable" 状態になっていてほしい!」
というの思いがある。
ということは、 EditorApplication.isPlaying
ではダメなのだ!
別のものに変えよう。
もちろんいいものを Unity 側は用意してくれている。
EditorApplication.isPlayingOrWillChangePlaymode
というものがあるのさ!
随分と長ったらしい名前のプロパティだが、これはゲーム実行中+ゲーム実行に移行中のときも 'true' を返してくれるという、今回の悩みをすべて解決してくれるようなプロパティだ。
docs.unity3d.com
先ほどの RuntimeDisableAttribute
で使ってみよう。
RuntimeDisableDrawer.cs
#if UNITY_EDITOR [CustomPropertyDrawer(typeof(RuntimeDisableAttribute))] public class RuntimeDisableDrawer : PropertyDrawer { public override void OnGUI(Rect aPosition, SerializedProperty aProperty, GUIContent aLabel) { EditorGUI.BeginDisabledGroup(EditorApplication.isPlayingOrWillChangePlaymode); EditorGUI.PropertyField(aPosition, aProperty, aLabel, true); EditorGUI.EndDisabledGroup(); } } // class RuntimeDisableDrawer #endif // UNITY_EDITOR
うまく動作しているようだね。
えかったえかった。
こういう簡単なエディタの拡張をできる余裕がいつも欲しいものですな!
GGJ2019 in ヤフー大阪
活動再開の狼煙がグローバルゲームジャムというのが実に僕らしい。
久々のブログ更新ですよー。
ゲーム作りはいつだって楽しいものですよ。
【Unity】GUIStyleでエディタの色を変えてみたよ
夏が終わりましたが、今年も実に色のないものでした。
だからこそせめて、エディタ上くらいはカラフルにしたいものです。
今回はGUIStyle
を使って、エディタに色を付けていきましょう。
【Unity】稲妻のアセットを使って、フォースの暗黒面に触れる
夏ですねー。
世間の人々は、海水浴に行ったり、バーベキューをしたり、花火を見たりしているのでしょねー。
まあ、ぼっちの僕には縁遠い話だがなぁ!
というわけで今回は、AssetStoreで公開されている稲妻のアセットを使って、夏を楽しんでいる人々を絶望のどん底に落としてみましょう。
残念ながら、現在のUnityでは現実世界に影響を与えることが出来ません。
そのため気分を味わうだけになりますが、少しはこの夏の鬱憤が晴れると思いますよ。
【Unity】GUI.colorでエディタの色を変えてみたよ
私の人生は実に色のない人生だった。
だからこそせめて、エディタ上くらいはカラフルにしたいものです。
今回はGUI.color
を使って、エディタに色を付けていきましょう。
【Unity】2018.2に更新したら、VisualStudioでエラーが出始めた
ついにUnity2018.2が公開されましたよ。
よし、早速インストールだ!
おお、Projectビュー内が、AssetsとPackagesで分かれている。
いろいろ変化がありますね。
では、早速何かスクリプトを書いてみましょうか。
VisualStudioを立ち上げて、スクリプトを書いて、ビルドっと……。
ん、何かよくわからないエラーが出たぞ。
これは一体何なんだ!