FC2ブログ
    02 «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.» 04

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

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

     

    【ハルシオンブログ】enumの値と名前をforeachで取得する 

    こんにちは。
    大坂です。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    enumの値と名前をforeachで取得したい時のお話。
    大した話でもないですがコードです。

    enum EnumTest
    {
    Test_1,
    Test_2,
    Test_3,
    Test_4,
    }

    void Start()
    {
    Array array = Enum.GetValues(typeof(EnumTest));

    foreach (var val in array)
    {
    string name = Enum.GetName(typeof(EnumTest), val);
    Debug.Log($"{name}:{(int)val}");
    }
    }


    ちょっとした時に使いたかったのでメモがてらに方法を紹介でした。
    ではではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityの開発でOfTypeって使ってますか?リストから型指定で取り出すのに便利ですね! 

    こんにちは。坂内っす。
    あと1週間で3月も終わってしまいますね!
    日が経つのが早いです!

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    Unityで開発していて、OfTypeって使ってますか?

    配列(List).OfType<型> って感じで使います。
    配列の中から指定した型を取り出すことができます。


    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;

    public class Blog20240325 : MonoBehaviour
    {
    void Start()
    {
    ArrayList list = new ArrayList();
    list.Add(1000);
    list.Add("AAAA");
    list.Add("BBBB");
    list.Add(new GameObject());
    list.Add(2000);

    IEnumerable<int> intAry = list.OfType<int>();

    foreach (var item in intAry)
    {
    Debug.Log(item);
    }
    }
    }



    こんな感じのコードを書くと、listからintだけを取り出すことができます。

    1000
    UnityEngine.Debug:Log (object)
    Blog20240325:Start () (at Assets/Scripts/Blog20240325.cs:21)

    2000
    UnityEngine.Debug:Log (object)
    Blog20240325:Start () (at Assets/Scripts/Blog20240325.cs:21)

    また、こんな感じで親クラスのリストから指定したクラスのみを持ってくることもできます。


    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;

    public class Blog20240325 : MonoBehaviour
    {
    public class BaseClass {
    public int no;
    public string className;
    }

    public class ClassA : BaseClass
    {
    public ClassA() {
    no = 1;
    className = "ClassA";
    }
    }
    public class ClassB : BaseClass
    {
    public ClassB() {
    no = 2;
    className = "ClassB";
    }
    }
    public class ClassC : BaseClass
    {
    public ClassC() {
    no = 3;
    className = "ClassC";
    }
    }

    void Start()
    {
    List<BaseClass> list = new List<BaseClass>();
    ClassA classA = new ClassA();
    list.Add(classA);
    ClassB classB = new ClassB();
    list.Add(classB);
    ClassC classC = new ClassC();
    list.Add(classC);

    ClassB listupClass = list.OfType<ClassB>().FirstOrDefault();

    Debug.Log(listupClass.className);
    }
    }



    ClassB
    UnityEngine.Debug:Log (object)
    Blog20240325:Start () (at Assets/Scripts/Blog20240325.cs:46)

    OfType結構便利ですよね。

    OfTypeの簡単な紹介でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Riderでアプリケーション切り替え時に自動保存してほしくない時 

    こんにちは。
    大坂です。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    Riderを使っていてRiderから別のアプリケーションに切り替えた時に自動保存してほしくない時の設定です。
    設定の[外観&振る舞い]-[システム設定]の「別のアプリケーションに切り替えるときにファイルを保存する」をオフにすると自動保存されなくなります。


    自動保存で便利なときもあるので個人的にどちらがいいかはわかりませんが…。
    気になる人はオフにしてみてくださいまし。
    ではではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】foreachではなく、Foreachの紹介。意外と使いやすいですよ! 

    こんにちは。
    坂内っす。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    ListのForeachって使ってますか?

    意外と使い勝手がいいForeachです。

    こんな感じで使えます。


    using System.Collections.Generic;
    using UnityEngine;

    public class Blog20240318 : MonoBehaviour
    {
    public class Num {
    public int index;
    public string name;
    }

    List array = new();

    private void Start() {
    for (int i = 0; i < 10; i++) {
    Num num = new Num();
    num.index = i;
    num.name = "名前:" + i;
    array.Add(num);
    }

    array.ForEach(num => {
    Debug.Log("----------------");
    Debug.Log(num.index);
    Debug.Log(num.name);
    });
    }
    }



    Foreachの中はラムダ式になってます。

    ----------------
    0
    名前:0
    ----------------
    1
    名前:1
    ----------------
    2
    名前:2




    こんな感じのが出力されます。

    もちろん今までのように


    foreach(Num num in array){
    Debug.Log("----------------");
    Debug.Log(num.index);
    Debug.Log(num.name);
    }



    って書いてもいいです。

    使いやすいほう使ってくださいませ。

    ということで、ListのForeachメソッドというのがあるよって紹介でした!

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】小数点以下の値を確認して処理するとき 

    こんにちは。
    大坂です。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    単純に小数点以下の値が欲しいときのお話。

    1で割った余りを使う方法。

    var num = 12.345f;
    var decimalPlace = num % 1;
    if (decimalPlace > 0f)
    {
    Debug.Log(decimalPlace);
    }


    stringに変換して確認する方法。

    var num = 12.345f;
    var str = num.ToString();
    if (str.Contains("."))
    {
    string[] test = str.Split(".");
    Debug.Log(test[1]);
    }


    こんな感じで小数点以下があるときに処理するとかができますね。
    stringに変換する場合はこんなことがあるみたいなので注意が必要です。
    【ハルシオンUnityブログ】一部海外でのfloat等小数点区切り文字が,(カンマ)で問題がでてしまう件

    ではではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】UniRxでボタンの押下処理をやってみよう。結構簡単にかけていいですね! 

    こんにちは。
    坂内っす。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    UniRxを使ってボタンを押したときの処理を簡単に紹介。

    ButtonとImageをCanvasに配置して、ボタンを押すとImageのカラーをランダムに切り替えるような処理を書いてみた。
    まずは今までの書き方。


    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20240311 : MonoBehaviour
    {
    [SerializeField] Button btnProc;
    [SerializeField] Image imgItem;

    private void Start() {
    // ボタンが押された時の処理
    btnProc.onClick.AddListener(ChangeImageColor);
    }

    void ChangeImageColor() {
    imgItem.color = Random.ColorHSV();
    }
    }



    UniRxを使わない時は、こんな感じに書いていたと思う。
    onClickのAddListenerでやってました。


    これをUniRxで書くとこんな感じに


    using UniRx;
    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20240311 : MonoBehaviour
    {
    [SerializeField] Button btnProc;
    [SerializeField] Image imgItem;

    private void Start() {
    btnProc.OnClickAsObservable().Subscribe(_ => {
    // ボタンが押された時の処理
    ChangeImageColor();
    });
    }

    void ChangeImageColor() {
    imgItem.color = Random.ColorHSV();
    }
    }



    なんぞ文字列としては、UniRxのほうが文字数多いけど・・・・
    UniRxの利点はなんだろうか?
    色々なことができるらしい。

    とりあえず連打制御を追加してみましょう。


    using System;
    using UniRx;
    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20240311 : MonoBehaviour
    {
    [SerializeField] Button btnProc;
    [SerializeField] Image imgItem;

    private void Start() {
    btnProc.OnClickAsObservable()
    .ThrottleFirst(TimeSpan.FromMilliseconds(1000))
    .TakeUntilDestroy(this)
    .Subscribe(_ => {
    // ボタンが押された時の処理
    ChangeImageColor();
    });
    }

    void ChangeImageColor() {
    imgItem.color = UnityEngine.Random.ColorHSV();
    }
    }




    ThrottleFirstというのを追加しました。
    引数の秒以下は再押下を受け付けないという感じです。

    .ThrottleFirst(TimeSpan.FromMilliseconds(1000))
    なので、「1秒以下の連打は受け付けない」といった感じでしょうか。

    それと、「.TakeUntilDestroy(this)」もつけておきましょう。

    ボタンがDestroyされた後も購読処理が残ってしまうので、メモリリークの対応として書いておいたほうがいいらしいです。

    こんな感じでUniRxでも簡単にボタンの押下処理を書くことができます。

    カンタンな紹介でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Stopwatchの「new Stopwatch」「Start」をまとめて行う 

    こんにちは。
    大坂です。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    Stopwatchの「new Stopwatch」「Start」ってまとめて行えるんですね。
    大した話でもないんですけど。

    今まで書いてた書き方

    var sw = new Stopwatch();
    sw.Start();
    // 処理
    sw.Stop();
    Debug.Log(sw.Elapsed.TotalSeconds);


    まとめた書き方

    var sw = Stopwatch.StartNew();
    // 処理
    sw.Stop();
    Debug.Log(sw.Elapsed.TotalSeconds);


    これだけの話ですが、まぁ知ってれば書くのを少しだけ短縮できますかね。
    何かの時に試してみてくださいまし。

    ではではノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】UniRxのReactivePropertyのSubscribeが意図せずに複数回動いてしまった件。え?基本だって? 

    こんにちは!
    3月に入りました!もう1年の1/6が終わってしまいましたね・・・・坂内っす。


    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:



    UniRxで、こんな感じでReactivePropertyをしようして処理を書いていたんだけど、変な結果になってしまった。


    using UnityEngine;
    using UniRx;

    public class Blog20240304 : MonoBehaviour
    {
    ReactiveProperty<int> hp = new ReactiveProperty<int>(100);

    private void Start() {
    hp.Subscribe((val) => {
    if (val <= 0) {
    // 死んだ処理
    Debug.Log("しんだよ");
    }
    Debug.Log(val);
    });

    CalcDamage(200);
    }

    void CalcDamage(int damage) {
    hp.Value = Mathf.Clamp(hp.Value -= damage, 0, 1000);
    }
    }



    CalcDamageでダメージを受けて、hpのサブスクライブでHPが0以下になったら死んだ処理をおこなっている。

    これを動かすと、こんな結果になります。



    2回「しんだよ」の処理が流れてしまう。

    Clampの中でhp.Value += をやっているのが原因でした。
    ここでhpに入れ込んでいるため、Subscribeが動いてしまってます。

    CalcDamageを以下に修正することで対応できました。


    void CalcDamage(int damage) {
    hp.Value = Mathf.Clamp(hp.Value - damage, 0, 1000);
    }



    無駄にReactivePropertyを変更するとSubscribeが動いてしまうのがちょっと気を付けないといけないですね。

    え?こんなことやるやついないって?
    俺もそう思いますが、ちょっとこんなコードを見つけてしまったので注意ってことですね。


    そんなことでReactivePropertyのSubscribeが意図せずに複数回動いてしまう件についてでした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0