FC2ブログ
    07 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 09

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】Unity 透過ImageのBatchesを減らして少しでも軽くする方法。 

    こんにちは。坂内っす。
    暑い日が続きますねぇ~ 夏ですねぇ~
    明日ワクチン1回目っす。

    Unityで透過のImageって使ったりしますよね。
    こんな感じで透過のImageを置きます。


    そうすると、Batchesが4になります。



    ここで、透過ImageのCanvasRendererにある「Cull TransparentMesh」にチェックを入れると、なんとBatchesが3になるんです!





    少しでも重くてBatchesを減らしたい方はやってみてくださいませ。
    alphaを完全に0にしないと効果はないようですが。

    透過Image使ってる方は見直してみてはいかがでしょうか。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Tupleを利用した変数の値の交換(スワップ) 

    こんにちは。
    大坂です。

    特に使いどころがあったわけではないですが、そんなことも出来るんだということで、
    Tupleを利用した変数の値の交換方法を紹介。

    こんな感じで値の入れ替えができます。

    int test_1 = 10;
    int test_2 = 20;

    Debug.Log($"交換前 test_1: {test_1}");
    Debug.Log($"交換前 test_2: {test_2}");

    // 交換処理
    (test_1, test_2) = (test_2, test_1);

    Debug.Log($"交換後 test_1: {test_1}");
    Debug.Log($"交換後 test_2: {test_2}");


    結果。

    ちゃんと値が交換されてますね。

    これリストとかでもできるので、試してみました。

    List list_1 = new List() { 0, 1, 2 };
    List list_2 = new List() { 3, 4, 5 };

    Debug.Log($"交換前 list_1: {string.Join(",", list_1)}");
    Debug.Log($"交換前 list_2: {string.Join(",", list_2)}");

    // 交換処理
    (list_1, list_2) = (list_2, list_1);

    Debug.Log($"交換後 list_1: {string.Join(",", list_1)}");
    Debug.Log($"交換後 list_2: {string.Join(",", list_2)}");


    結果。

    リストでも値が交換されましたね。

    ということで、こんなことができるよという紹介でした。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】UnityのEventTrigger処理呼び出しをコードで書く方法。 

    こんにちは。坂内っす。

    パラリンピックが明日から開催のようですね。
    そういえば見たことなかったですね・・・まぁオリンピックもほぼ見ないんですけどね・・・

    さて、ポケガ3の進捗ですが、難産に難産を重ねて難産中です。

    可愛い女の子育てたいですよね?
    ってことで、キャラデザのイラストレーターさんが現在4人目。
    そしてシナリオライターさんもなんと3人目!

    完成するのでしょうか??
    完成させますけどね!
    現状ですと、リリース予定は来年の4月ころ?
    おかしいなぁ~ 今年の4月ころにはリリースしようとしてたんだけどねぇ・・

    なにはともあれリリースまで頑張っていくしかありませんね。

    2020年の8月からまともな収入がない現状、いつ死ぬかわかりませんが・・・


    さて、UnityのuGUIでボタンがありますが、ボタンが"押される"という処理は"ボタンを押す+ボタンを離す"これでワンセットになってますよね。
    "押したけど離さない"だと、ボタンのOnClickが呼ばれません。

    "押した瞬間に処理"をさせたい場合はEventTriggerを使ったりします。

    [EventTrigger]についてはリファレンスをどうぞ
    https://docs.unity3d.com/ja/2018.4/ScriptReference/EventSystems.EventTrigger.html

    EventTriggerを使えば、ドラッグアンドドロップの処理なんかもできますね。

    今回はEventTriggerのPointerEnterの処理をコード側で呼ぶ方法のメモ。

    ボタンの場合はこんな感じで処理を呼べます。

    [Blog20210823.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20210823 : MonoBehaviour
    {
    [SerializeField] Button btnA;

    private void Start() {
    btnA.onClick.AddListener(OnClickA);
    }

    void OnClickA() {
    // 処理
    }
    }



    onClick.AddListenerでメソッドを呼ぶことができました。

    しかしEventTriggerの場合は同じことをしようとすると、こんな感じになります。



    OnPointerEnterにはAddListenerがありません。

    ということで、こんな感じで書くことができます。

    [Blog20210823.cs]

    using UnityEngine;
    using UnityEngine.EventSystems;

    public class Blog20210823 : MonoBehaviour
    {
    [SerializeField] EventTrigger evtA;

    private void Start() {
    EventTrigger.Entry pDown = new EventTrigger.Entry();
    pDown.eventID = EventTriggerType.PointerDown;
    pDown.callback.AddListener((data) => OnClickA());
    evtA.triggers.Add(pDown);
    }

    void OnClickA() {
    // 処理
    }
    }



    ボタンと比べるとちょっとめんどいけど、コードで書くと追いやすくていいですよね!
    Inspectorで処理をアサインするのもいいけど、うちではコードで書くのが流行ってます。

    ということで、EventTriggerの処理呼び出しをコードでやる方法でした!もちろんPointerEnterとかも使えますよ!

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】stringからenumへの変換 

    こんにちは。
    大坂です。

    stringからenumに変換したいときがあったのでそのお話。

    適当にこんなenumがあったとして。

    enum TestEnum {
    Test_1,
    Test_2,
    Test_3,
    }


    方法その1「Enum.Parse」を使う。

    // Perseで変換成功
    TestEnum testEnum_1 = (TestEnum)Enum.Parse(typeof(TestEnum), "Test_1");
    Debug.Log($"testEnum_1:{testEnum_1}");

    // Perseで変換 TestEnumにTest_4がないためエラーになる
    TestEnum testEnum_2 = (TestEnum)Enum.Parse(typeof(TestEnum), "Test_4");
    Debug.Log($"testEnum_2:{testEnum_2}");


    実行結果。

    変換に失敗するとエラーが返ってきますね。

    方法その2「Enum.TryParse」を使う。

    // TryPerseで変換成功し、Trueが返ってくる
    bool testBool_1 = Enum.TryParse<TestEnum>("Test_2", out TestEnum testEnum_3);
    Debug.Log($"testEnum_3:{testEnum_3}:{testBool_1}");

    // TryPerseで変換 TestEnumにTest_5がないが、Falseで返ってきて、testEnum_4にはTestEnum.Test_1が入る。
    bool testBool_2 = Enum.TryParse<TestEnum>("Test_5", out TestEnum testEnum_4);
    Debug.Log($"testEnum_4:{testEnum_4}:{testBool_2}");


    実行結果。

    変換に失敗してもエラーは帰ってこないで、enumの1個目の値が入ってますね。
    戻り値でfalseが返ってくるので、それを使って判定するとよさそうでしょうか。

    こんな感じでstringからenumに変換できます。
    どちらの方法でもできますが、エラーが返ってくるのはいまいちなので、「Enum.TryParse」の方がいいですかね。

    では今週もこれにてノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】プロジェクトウインドウのファイル検索で複数文字列検索をする方法。 

    おはようございます。坂内っす。
    ようやくワクチン1回目の日にちが決まったっす。
    まじで横浜おっせーなー

    さてさて、UnityのProjectウインドウで検索ってありますが、これ使ってます?
    こんなファイル状態での検索

    [SS2]

    まずは「a」と打ってみます。
    [SS2]

    aのつくファイルをすべてピックアップしてきますね。

    では、「aa」と打ちます。
    [SS2]

    aaという文字が入っているファイルがピックアップされました。

    「aa」と「c」が入っているファイルを探す場合はどうすれば?

    簡単です。

    「aa c」とorで探す場合はスペースをつけます。
    [SS2]

    こんな感じで複数文字での検索ができるので是非使ってくださいね!


    簡単なメモ的なやつでした!あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Hierarchyにあるシーンを取得する 

    こんにちは。
    大坂です。

    ふと、Hierarchyにあるシーンを取得したいときがあったのでその方法です。


    SceneManagerを使えば簡単です。

    for (int i = 0; i < SceneManager.sceneCount; i++) {
    Debug.Log(SceneManager.GetSceneAt(i).name);
    }


    取得できてますね。


    まぁこれだけだと、ロードしてないシーンも取れてしまうので、
    「Scene.isLoaded」を使ってロードしているかどうか判断できます。

    for (int i = 0; i < SceneManager.sceneCount; i++) {
    if(SceneManager.GetSceneAt(i).isLoaded) {
    Debug.Log(SceneManager.GetSceneAt(i).name);
    }
    }


    ちゃんとロードしていないシーンを除外できてます。


    何か使えるときがあったら使ってみてくださいまし。
    では今週もこれにてノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Dictionaryからデータを取り出す時はこうやって取り出すといいらしいよ? 

    こんにちは!
    もう8月になってしまいましたね!夏真っ盛り!
    暑いの嫌いです。坂内っす。

    UnityでDictionaryって使ってますか?
    Dictionary型のデータをまとめて取り出すときに、こんな感じで取り出しますよね。

    Dictionary<int, int> dic = new Dictionaryint, int>();
    foreach (var data in dic) {
    val += data.Value;
    }



    他にもこんな感じでも取り出せます。


    Dictionary<int, int> dic = new Dictionary<int, int>();
    foreach (var key in dic.Keys) {
    val += dic[key];
    }


    ちょっと両方の方法で実際に取り出してみましょう。


    using System.Collections.Generic;
    using UnityEngine;

    public class Blog20210802 : MonoBehaviour
    {
    void Start()
    {
    var sw = new System.Diagnostics.Stopwatch();

    Dictionary<int, int> dic = new Dictionary<int, int>();
    // データ用意
    for (int i = 0; i < 10000000; i++) {
    dic.Add(i, i);
    }

    // DictionaryのValueをkeysを基点に取り出す
    long val = 0;
    sw.Start();
    foreach (var key in dic.Keys) {
    val += dic[key];
    }
    Debug.Log(val);
    sw.Stop();
    Debug.Log("時間 : " + sw.Elapsed);

    // DictionaryのValueを取り出す
    val = 0;
    sw.Restart();
    foreach (var data in dic) {
    val += data.Value;
    }
    Debug.Log(val);
    sw.Stop();
    Debug.Log("時間 : " + sw.Elapsed);

    }
    }



    10,000,000個Dictionaryにintを詰め込んで、全部取り出して足す処理。

    結果はこんな感じ。


    後者の
    foreach (var data in dic) {
    val += data.Value;
    }
    こっちのほうが断然早いですね。
    ということで、Dictionaryで全件取り出す場合は、
    foreach(var key in dic.keys)
    より
    foreach(var data in dic)
    で取り出した方が早いのでそっちを使いましょうということでした。

    ちょっとしたメモでした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0