20190503のUnityに関する記事は5件です。

【Unity】簡単かもしれないTextだけで選択メニュー

はじめに

Textだけで選択メニュー的なのを作ってみました。デザインをこったりすることはできませんが、簡単なUI作るのになら使えそうです。

コード

Sentaku_Text.cs
    public 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;
        }
    }

条件分岐の処理で該当する部分を"><"で挟むことで、選ばれてる感を出してます。
ちょっと説明しづらいので動作の様子は以下の通りです。
Sentaku_Text.gif

今回は処理で書いてないですが、非表示にしたいときは空文字をいれれば大丈夫です。

終わり

問題は選択肢が増えてきたときに、文字の入力がかなり面倒なことになりそうなところです。
でもちょろっと使う分には結構楽だと思います。選択肢が多いときは別の方法でやったがいい気がします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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
        }
    }
}

スクリーンショット 2019-05-03 21.34.38.png

スクリーンショット 2019-05-03 21.34.53.png

iOSなどでAutoRotationにしている場合などに便利です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】 batch mode で Import Package するときにハマったこと

TL;DR

  • Unityのバージョンは 2018.3.6f1 です。
  • 普通の AssetDatabase.ImportPackage だと処理完了前にprocess が終わってしまって取り込めない
  • internal Method だけど AssetDatabase.ImportPackageImmediately というのがあるのでそれをReflectionで使いましょう
importpackage.cs
public 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 がうまくいない

importpackage.cs
public 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 を定義してどこまで行ってるか見る

importpackage.cs
public 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.cs
public 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できました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityで綺麗な映像を作る設定(Unity2019.1編)

自己紹介

こんにちはゆずです。@Yuzu_Unity
自分はUnityエンジニア・3DCGデザイナーの学生です。(軸はエンジニア 4年ほど…)
※自分は現在どこの企業にも所属していませんので技術周りなら色々言っちゃおうかと
      インターンとか行きたいです…(切実(4回目))

オリジナルのVtuberですのでチャンネル登録お願いします…
藤田りあ@Ria_fujita  自己紹介動画
上記のリンクの映像を作るための技術紹介記事です。

はじめに

今回はLWRPやHDRPではなく標準設定の通常レンダーパイプラインでの設定です。
HDRPは奇麗なのですがトゥーンシェーダーとは相性が悪いですね…
影を入れるととくに動作は重いので、ある程度のスペックのPCで行います。

初期設定

Edit→ProjectSettingsを開きます。
Playerタブを開きColorSpaceをLinerに設定します。
image.png

次にQualityタブを開き
LevelsをUltla
AntiAliasingを上げます
image.png

Window→Lightning→LightmapのAutoGenerateを外しましょう
(作業中にライトマップ焼かれるのは厄介なので…)
またLightmapSize等の項目もお好みで…
image.png

ゲームビューにレンダリング解像度を設定しておきます。
今回は1920×1080
image.png

シーンビューの右上のカメラマークを押しFOVの設定をカメラの画角に合わせます。(Unity2019以降)
40から60程度かな?
image.png
Unity2019以外は以下のEditor拡張より
https://github.com/t-mat/UnitySceneViewFovControl/blob/master/README.ja.md

次にWindow→PackageManagerを開き
PostProcessingとChinemachineをインストールします。
image.png

Unityのライティングについて

DirectionalLightについて
初期設定ではColorが黄色になっているので白に戻します。
Strengthをいじると影色が薄くなります。
image.png

シャドウマップの解像度を直接指定します。
DirectionalLightに対しこのスクリプトをアタッチします。
これを行うと影のディテールが上がります。(重いので注意)
(HDRPだと直接指定できるのですが通常レンダリングパイプラインではないので直接指定)

SetShadowResoliution
using 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
image.png

以上です。
他にもアセットで色々あったりしますが今回はここまでです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityで綺麗な映像を作る環境作り(Unity2019.1編)

自己紹介

こんにちはゆずです。@Yuzu_Unity
自分はUnityエンジニア・3DCGデザイナーの学生です。(軸はエンジニア 4年ほど…)
※自分は現在どこの企業にも所属していませんので技術周りなら色々言っちゃおうかと
      インターンとか行きたいです…(切実(4回目))

オリジナルのVtuberですのでチャンネル登録お願いします…
藤田りあ@Ria_fujita  自己紹介動画
上記のリンクの映像を作るための技術紹介記事です。

はじめに

今回はLWRPやHDRPではなく標準設定の通常レンダーパイプラインでの設定です。
HDRPは奇麗なのですがトゥーンシェーダーとは相性が悪いですね…
影を入れるととくに動作は重いので、ある程度のスペックのPCで行います。

初期設定

Edit→ProjectSettingsを開きます。
Playerタブを開きColorSpaceをLinerに設定します。
image.png

次にQualityタブを開き
LevelsをUltla
AntiAliasingを上げます
image.png

Window→Lightning→LightmapのAutoGenerateを外しましょう
(作業中にライトマップ焼かれるのは厄介なので…)
またLightmapSize等の項目もお好みで…
image.png

ゲームビューにレンダリング解像度を設定しておきます。
今回は1920×1080
image.png

シーンビューの右上のカメラマークを押しFOVの設定をカメラの画角に合わせます。(Unity2019以降)
40から60程度かな?
image.png
Unity2019以外は以下のEditor拡張より
https://github.com/t-mat/UnitySceneViewFovControl/blob/master/README.ja.md

次にWindow→PackageManagerを開き
PostProcessingとChinemachineをインストールします。
image.png

Unityのライティングについて

DirectionalLightについて
初期設定ではColorが黄色になっているので白に戻します。
Strengthをいじると影色が薄くなります。
image.png

シャドウマップの解像度を直接指定します。
DirectionalLightに対しこのスクリプトをアタッチします。
これを行うと影のディテールが上がります。(重いので注意)
(HDRPだと直接指定できるのですが通常レンダリングパイプラインではないので直接指定)

SetShadowResoliution
using 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
image.png

以上です。
他にもアセットで色々あったりしますが今回はここまでです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む