- 投稿日:2019-05-03T22:56:02+09:00
【Unity】簡単かもしれないTextだけで選択メニュー
はじめに
Textだけで選択メニュー的なのを作ってみました。デザインをこったりすることはできませんが、簡単なUI作るのになら使えそうです。
コード
Sentaku_Text.cspublic int SentakuID = 0; int cnt = 0; Text _text; void Start(){ _text = GetComponent<Text>(); } void Update(){ float YAxis = Input.GetAxisRaw("Vertical"); //長押しで連続入力 if (YAxis != 0) { cnt++; if (cnt == 1) SentakuID -= (int)YAxis; else if (cnt >= 20) SentakuID -= (int)YAxis; } else if (YAxis == 0) cnt = 0; //一番端にいったら反転 if (SentakuID > 2) SentakuID = 0; if (SentakuID < 0) SentakuID = 2; Sentaku(); } void Sentaku() { switch (SentakuID) { case 0: _text.text = ">0だよ<" + "\n" + "1だよ" + "\n" + "2だよ"; break; case 1: _text.text = "0だよ" + "\n" + ">1だよ<" + "\n" + "2だよ"; break; case 2: _text.text = "0だよ" + "\n" + "1だよ" + "\n" + ">2だよ<"; break; default: break; } }条件分岐の処理で該当する部分を"><"で挟むことで、選ばれてる感を出してます。
ちょっと説明しづらいので動作の様子は以下の通りです。
今回は処理で書いてないですが、非表示にしたいときは空文字をいれれば大丈夫です。
終わり
問題は選択肢が増えてきたときに、文字の入力がかなり面倒なことになりそうなところです。
でもちょろっと使う分には結構楽だと思います。選択肢が多いときは別の方法でやったがいい気がします。
- 投稿日:2019-05-03T21:52:54+09:00
[Unity] シェーダーで画像を回転させる
m_cameraTex = new WebCamTexture()で指定できるテクスチャサイズはあくまでもリクエストサイズで、リクエストそのままのサイズが返ってくるとは限りません。
さらに、返ってきたwidth,heightも、デバイスの向きによってm_cameraTex.videoRotationAngle // 0,90,180,270の角度分だけ回転した値が返ってきます。
つまりwidth,heightが入れ替わっていることがあります。
また、デバイスによって画像が左右反転していたりします(iOSだと反転、PCだとそのままなど)。
これの補正をUIやGameObject側で行うと何かと面倒だったので、
マテリアルで吸収するシェーダーを作りました。Shader "Video/UnlitShader" { Properties { _MainTex ("Texture", 2D) = "white" {} [ToggleOff] _Mirror("Mirror", Float) = 0 [Enum(0deg,0,90deg,1, 180deg,2, 270deg,3)] _RotType ("Rotate Type", Float) = 0 } SubShader { Tags { "RenderType"="Opaque" "Queue" = "Geometry+10" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _Mirror; float _RotType; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); float2 edtuv = TRANSFORM_TEX(v.uv, _MainTex); float tmp; if(_RotType==0){} else if(_RotType==1){ tmp = edtuv.x; edtuv.x = 1-edtuv.y; edtuv.y = tmp; } else if(_RotType==2){ edtuv.x = 1-edtuv.x; edtuv.y = 1-edtuv.y; } else if(_RotType==3){ tmp = edtuv.x; edtuv.x = edtuv.y; edtuv.y = 1-tmp; } if(_Mirror==1){ edtuv.x = 1-edtuv.x; } o.uv = edtuv; return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture float4 col = tex2D(_MainTex, i.uv); return col; } ENDCG } } }iOSなどでAutoRotationにしている場合などに便利です。
- 投稿日:2019-05-03T13:30:04+09:00
【Unity】 batch mode で Import Package するときにハマったこと
TL;DR
- Unityのバージョンは 2018.3.6f1 です。
- 普通の AssetDatabase.ImportPackage だと処理完了前にprocess が終わってしまって取り込めない
- internal Method だけど AssetDatabase.ImportPackageImmediately というのがあるのでそれをReflectionで使いましょう
importpackage.cspublic static void ImportPackage() { var packageName = "Sample.unitypackage"; var type = typeof(AssetDatabase); var binding = BindingFlags.NonPublic | BindingFlags.Static; var assetDatabaseMethodInfo = type.GetMethod("ImportPackageImmediately", binding); assetDatabaseMethodInfo.Invoke(type, new object[] {packageName}); }batch mode で ImportPackage がうまくいない
- スクリプトリファレンスに記載されているAPIは AssetDatabase.ImportPackage
- 普通にこれで試す
importpackage.cspublic static void ImportPackage() { //batch mode なので第2引数の interactive は false AssetDatabase.ImportPackage("Sample.unitypackage", false); }
- 結果、うまくインポートできてない
- Logを見ても実行自体には成功している
MenuItem にしてGUI上で試す
importpackage.cs[MenuItem("ImportPackage")] public static void ImportPackage() { //batch mode なので第2引数の interactive は false AssetDatabase.ImportPackage("Sample.unitypackage", false); }
- 普通にAsset/ImportAsset/CutstomPackage の流れでImportしたときと同じように取り込まれる
- ちゃんと取り込まれてるのはGit差分でわかる。
????????
callback を定義してどこまで行ってるか見る
- AssetDatabase-ImportPackageCallback でそれぞれのタイミングでLogを吐き出させる
importpackage.cspublic static void ImportPackage() { AssetDatabase.importPackageCompleted += ImportCompleted; AssetDatabase.importPackageCancelled += ImportCancelled; AssetDatabase.importPackageFailed += ImportCallBackFailed; AssetDatabase.importPackageStarted += ImportStarted; AssetDatabase.ImportPackage("Sample.unitypackage", false); } static void ImportCompleted(string packageName) { Debug.Log ("Completed " + packageName); AssetDatabase.importPackageCompleted -= ImportCompleted; } static void ImportCancelled(string packageName) { Debug.Log ("Cancelled " + packageName); AssetDatabase.importPackageCancelled -= ImportCancelled; } static void ImportCallBackFailed(string packageName, string _error) { Debug.Log ("Failed " + packageName); AssetDatabase.importPackageFailed -= ImportCallBackFailed; } static void ImportStarted(string packageName) { Debug.Log ("Started " + packageName); AssetDatabase.importPackageStarted -= ImportStarted; }
- 実行したLogを見ると Started Sample.unitypackage しか出てない
- おかしいぞ?
AssetDatabaseの実装を見に行く
- ImportPackageImmediately というのが ImportPackageとは別にあるのを見つける
- 絶対これやんけ!!!
- ただし、internal method なので普通には使えない
- Reflectionで解決しよ。。。
importpackage.cspublic static void ImportPackage() { var packageName = "Sample.unitypackage"; var type = typeof(AssetDatabase); var binding = BindingFlags.NonPublic | BindingFlags.Static; var assetDatabaseMethodInfo = type.GetMethod("ImportPackageImmediately", binding); assetDatabaseMethodInfo.Invoke(type, new object[] {packageName}); }
- 結果、無事 batchModeでImportPackageできました。
- 投稿日:2019-05-03T01:29:52+09:00
Unityで綺麗な映像を作る設定(Unity2019.1編)
自己紹介
こんにちはゆずです。@Yuzu_Unity
自分はUnityエンジニア・3DCGデザイナーの学生です。(軸はエンジニア 4年ほど…)
※自分は現在どこの企業にも所属していませんので技術周りなら色々言っちゃおうかと
インターンとか行きたいです…(切実(4回目))オリジナルのVtuberですのでチャンネル登録お願いします…
藤田りあ@Ria_fujita 自己紹介動画
上記のリンクの映像を作るための技術紹介記事です。はじめに
今回はLWRPやHDRPではなく標準設定の通常レンダーパイプラインでの設定です。
HDRPは奇麗なのですがトゥーンシェーダーとは相性が悪いですね…
影を入れるととくに動作は重いので、ある程度のスペックのPCで行います。初期設定
Edit→ProjectSettingsを開きます。
Playerタブを開きColorSpaceをLinerに設定します。
次にQualityタブを開き
LevelsをUltla
AntiAliasingを上げます
Window→Lightning→LightmapのAutoGenerateを外しましょう
(作業中にライトマップ焼かれるのは厄介なので…)
またLightmapSize等の項目もお好みで…
ゲームビューにレンダリング解像度を設定しておきます。
今回は1920×1080
シーンビューの右上のカメラマークを押しFOVの設定をカメラの画角に合わせます。(Unity2019以降)
40から60程度かな?
Unity2019以外は以下のEditor拡張より
https://github.com/t-mat/UnitySceneViewFovControl/blob/master/README.ja.md次にWindow→PackageManagerを開き
PostProcessingとChinemachineをインストールします。
Unityのライティングについて
DirectionalLightについて
初期設定ではColorが黄色になっているので白に戻します。
Strengthをいじると影色が薄くなります。
シャドウマップの解像度を直接指定します。
DirectionalLightに対しこのスクリプトをアタッチします。
これを行うと影のディテールが上がります。(重いので注意)
(HDRPだと直接指定できるのですが通常レンダリングパイプラインではないので直接指定)SetShadowResoliutionusing UnityEngine; public class SetShadowResoliution : MonoBehaviour { public int resolution=4096; void Start () { //ライトマップの解像度を指定する GetComponent<Light>().shadowCustomResolution = resolution; } }Unityのライティングベイク機能(Staticオブジェクトのみ)
- LightMap ライトをベイク
- ReflectionProbe 反射をベイク(PBR)
- LightProbe GIをベイク
この3つを行えば背景がかなり綺麗になるので覚えておいたほうがいいかも…
レンダリング状況を確認する
Window→Analysis→FrameDebuggerにてレンダリング状況をデバックできます。
レンダーパイプラインによって違うので面白いですw
以上です。
他にもアセットで色々あったりしますが今回はここまでです。
- 投稿日:2019-05-03T01:29:52+09:00
Unityで綺麗な映像を作る環境作り(Unity2019.1編)
自己紹介
こんにちはゆずです。@Yuzu_Unity
自分はUnityエンジニア・3DCGデザイナーの学生です。(軸はエンジニア 4年ほど…)
※自分は現在どこの企業にも所属していませんので技術周りなら色々言っちゃおうかと
インターンとか行きたいです…(切実(4回目))オリジナルのVtuberですのでチャンネル登録お願いします…
藤田りあ@Ria_fujita 自己紹介動画
上記のリンクの映像を作るための技術紹介記事です。はじめに
今回はLWRPやHDRPではなく標準設定の通常レンダーパイプラインでの設定です。
HDRPは奇麗なのですがトゥーンシェーダーとは相性が悪いですね…
影を入れるととくに動作は重いので、ある程度のスペックのPCで行います。初期設定
Edit→ProjectSettingsを開きます。
Playerタブを開きColorSpaceをLinerに設定します。
次にQualityタブを開き
LevelsをUltla
AntiAliasingを上げます
Window→Lightning→LightmapのAutoGenerateを外しましょう
(作業中にライトマップ焼かれるのは厄介なので…)
またLightmapSize等の項目もお好みで…
ゲームビューにレンダリング解像度を設定しておきます。
今回は1920×1080
シーンビューの右上のカメラマークを押しFOVの設定をカメラの画角に合わせます。(Unity2019以降)
40から60程度かな?
Unity2019以外は以下のEditor拡張より
https://github.com/t-mat/UnitySceneViewFovControl/blob/master/README.ja.md次にWindow→PackageManagerを開き
PostProcessingとChinemachineをインストールします。
Unityのライティングについて
DirectionalLightについて
初期設定ではColorが黄色になっているので白に戻します。
Strengthをいじると影色が薄くなります。
シャドウマップの解像度を直接指定します。
DirectionalLightに対しこのスクリプトをアタッチします。
これを行うと影のディテールが上がります。(重いので注意)
(HDRPだと直接指定できるのですが通常レンダリングパイプラインではないので直接指定)SetShadowResoliutionusing UnityEngine; public class SetShadowResoliution : MonoBehaviour { public int resolution=4096; void Start () { //ライトマップの解像度を指定する GetComponent<Light>().shadowCustomResolution = resolution; } }Unityのライティングベイク機能(Staticオブジェクトのみ)
- LightMap ライトをベイク
- ReflectionProbe 反射をベイク(PBR)
- LightProbe GIをベイク
この3つを行えば背景がかなり綺麗になるので覚えておいたほうがいいかも…
レンダリング状況を確認する
Window→Analysis→FrameDebuggerにてレンダリング状況をデバックできます。
レンダーパイプラインによって違うので面白いですw
以上です。
他にもアセットで色々あったりしますが今回はここまでです。