FC2ブログ
    09 «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.» 11

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

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

     

    【ハルシオンブログ】uGUIのボタンを押した時に押せない時、EventSystemをみることで原因が分かるかも? 

    こんにちは。
    もう10月も終わって11月に片足突っ込んでますね。
    11月はデジゲーがありますね!何年振りだろうか、今年は遊びに行こうと思います!

    さて、Unityで色々とUIを作っていてボタンを用意したのに押せない時ってありません?
    UIがごちゃごちゃしてくるとこんなことがたまに起きます。
    そんな時はこうやれば解決するよという解決法を紹介。
    (もちろんこの方法だけですべて解決するわけではありません)



    2つのボタンがあります。
    ボタン1、ボタン2共に押せるのですが、なぜかボタン1の左半分が押せない…
    こんなことありません?

    こんな時はどうすればいいのか。
    EventSystemの情報をみれば解決します。



    あんまりみることがないかもしれませんが、EventSystemでは、クリックしたときの情報などが書かれています。

    ボタン1の右の方をクリックしている時は、こんな情報が出てます。



    pointerEnterがUGUI、pointerPressがButton1
    ボタン1にUGUIがついててそいつの上にカーソルがあるよってことなんですが、ちゃんと押してるものとしてButton1が取れてます。

    ボタン1の左の方をクリックするとこんな情報が出ます。



    pointerEnterがpanel、pointerPressがなし。

    ん?panelにカーソルがあるみたいです。



    実はボタン1の左側にパネルがあったようです。
    パネルがボタンの上にあったため、クリックができないということでした。


    と、まぁこんな感じでボタンがなぜ押せない理由をEventSystemをみることで解決することができるかもしれません。


    あんまり見ることがないEventSystemですが、こういうところで活躍するかもしれません。

    ということで、本日はここまで。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unity公式のsearch.extensionsでアセットの依存関係を確認できる 

    こんにちは。
    大坂です。

    プロジェクト内のプレハブとかスクリプトの依存関係を確認したいときがあったりなかったり。
    Unity公式で拡張機能を出してますね。
    https://github.com/Unity-Technologies/com.unity.search.extensions

    導入方法は上記のページに書いてありますが、以下で導入しました。
    [Window]-[Package Manager] で[+]を押して[Add package from git URL]を押す。
    URLの入力が求められるので、
    「https://github.com/Unity-Technologies/com.unity.search.extensions.git?path=package」
    と入力して「Add」を押す。

    導入すると[Window]-[Search]に[Dependency Viewer]が追加されているので押すと起動します。


    こんなWindowが表示されるのでBuildを押してしばらく待つと依存関係を確認できるようになります。


    Buildが終わったらProjectWindowでプレハブをクリックすると依存関係が見ることができます。

    ※クリックすると拡大します

    個人的には参照している数(〇がついてるところ)が見れるのがいいですね。
    使ってないやつとか整理できそうです。

    プロジェクトが大きくなって依存関係を簡単に確認したいときは導入してみるといいと思います。
    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】SuperTextMeshの禁則処理が最近(?)変わって動きがおかしくなったので、直してみた。1文字ずつ出す処理は簡単につくれるね! 

    こんにちは。
    ついにハルシオンがゲームイベントのブース側をやることになりました。
    来年2023年1月の東京ゲームダンジョン2です。
    https://tokyogamedungeon.com/

    今まで散々ゲームイベント遊びにいってましたが、出店側に回るとは考えてもいませんでしたよ。
    どうぞよろしく。

    UnityでSuperTextMeshを使用していますが、最近STMをアップデートしたらTextがこんな動きをするように・・・・



    これ、SuperTextMeshのTimingを使っていなく、別コードの方で1文字ずつ出すようにしてたんですよね。
    以前のバージョンだとこの禁則処理の動きってなかったんですが、調べてみるとv1.12.0にて以下の変更が入ったようです。

    * Added linebreak rules for Japanese, Chinese, and inadvertently English! This means that when using auto-wrap to split lines, characters like '{' and '$' will prefer not to appear at the end of a line, characters like '}' and '.' will prefer not to appear at the start, and numbers will prefer not to be split up. (If a text box is too thin to find a good place to split, it will still split on the spot, breaking these rules.)

    改行ルールが追加されたらしいです。

    んで勝手に変に改行されてしまうらしい。

    なので、SuperTextMeshのBreakTextにチェックを入れると勝手に改行されなくなります。





    まぁ こんな動きをつけるなら、STMの機能でつけた方がいいのかもしれません。



    TimingのRead Delayに時間を入れると、AutoReadやDrawAnimationNameなどの項目が出てきます。

    ここではAnimationにflyを入れてみましたが、こんな感じの動きが簡単に作れます。
    (※1文字ずつ出すコードはけしてます)



    1文字ずつ出す処理を使うなら、STMのTiming使うのがいいかもしれませんね。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityでスクリプト変更してコンパイルしたらConsoleログをクリアする機能が増えてた 

    こんにちは。
    大坂です。

    ConsoleのCleanのところクリックしたら「Clear on Recompile」なんてのが増えてました。
    Unity2021.1辺りから増えてる感じでしょうか。



    コンパイル開始時にConsoleログをクリアしてくれる感じですね。
    使うかどうかは微妙な感じなのですが、こんなの追加されたんだーっていうことで紹介だけ。

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Dotweenでオブジェクトを移動したりする際に、時間でなく速度で動かす方法 

    こんにちは。坂内っす。
    めっきり秋の天候になりましたね。
    でも2週間もしたら冬になるんじゃないですか?
    秋短そうな気がします。


    UnityでDoTweenを結構使ってるんですが、オブジェクトの移動の際に速度で移動させたいって時ありますよね。
    その方法を軽く紹介。

    まずはふつうに動かしてみます。

    [Blog20221017.cs]

    using UnityEngine;
    using UnityEngine.UI;
    using DG.Tweening;

    public class Blog20221017 : MonoBehaviour
    {
    [SerializeField] Image img1;
    [SerializeField] Image img2;

    IEnumerator Start()
    {
    yield return new WaitForSeconds(1f);
    img1.transform.DOLocalMoveX(252, 3f).SetEase(Ease.Linear);
    img2.transform.DOLocalMoveX(252, 3f).SetEase(Ease.Linear);
    }
    }





    こうやると、X座標252まで2つのオブジェクトが3秒かけて動きます。
    もちろん距離によって速度がバラバラになります。
    時間での移動になります。

    では同じ速度にしたい場合、今まではわざわざ計算してました・・・

    [Blog20221017.cs]

    using UnityEngine;
    using UnityEngine.UI;
    using DG.Tweening;
    using System.Collections;

    public class Blog20221017 : MonoBehaviour
    {
    [SerializeField] Image img1;
    [SerializeField] Image img2;

    IEnumerator Start()
    {
    yield return new WaitForSeconds(1f);
    float speed = 100f;
    float moveTime1 = (252f - img1.transform.localPosition.x) / speed;
    float moveTime2 = (252f - img2.transform.localPosition.x) / speed;
    img1.transform.DOLocalMoveX(252, moveTime1).SetEase(Ease.Linear);
    img2.transform.DOLocalMoveX(252, moveTime2).SetEase(Ease.Linear);
    }
    }





    こんな感じでやってたのですが、素敵なオプションがあるみたいです。

    SetSpeedBase

    これをつければわざわざ時間を計算しなくてもイイらしいです。

    [Blog20221017.cs]

    using UnityEngine;
    using UnityEngine.UI;
    using DG.Tweening;
    using System.Collections;

    public class Blog20221017 : MonoBehaviour
    {
    [SerializeField] Image img1;
    [SerializeField] Image img2;

    IEnumerator Start()
    {
    yield return new WaitForSeconds(1f);
    float speed = 150f;
    img1.transform.DOLocalMoveX(252, speed).SetEase(Ease.Linear).SetSpeedBased();
    img2.transform.DOLocalMoveX(252, speed).SetEase(Ease.Linear).SetSpeedBased();
    }
    }





    あらほんと‥‥素敵なオプションですね。

    これ使っていこうと思います。

    DoTweenで移動などの際に速度で動かす方法でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】ScrollViewのスクロール位置をスクリプトで変える 

    こんにちは。
    大坂です。

    ScrollViewのスクロール位置をスクリプトから変更したいことがありました。
    変更するのに使うのは、
    縦なら「verticalNormalizedPosition」
    横なら「horizontalNormalizedPosition」
    でスクリプトからスクロールの位置を変えることができます。

    100個のオブジェクトを作って、指定したオブジェクトにスクロール位置を変更するコード。

    public TestRow testRow;
    public Transform content;
    public ScrollRect testScroll;

    void Start()
    {
    // ここにスクロールを合わせたい
    int num = 20;
    // 全体の数
    int totalNum = 100;

    for(int i = 0; i < totalNum; i++) {
    var row = Instantiate(testRow, content);
    bool changeColor = i == num;
    row.SetText(i, changeColor);
    }
    // スクロール位置を変える。(1を設定すると1番上になる)
    testScroll.verticalNormalizedPosition = 1.0f - (float)num/ (float)totalNum;
    }

    実行。

    なんとなくそれっぽいところにスクロール位置が変更されますね。
    あとは環境に合わせて調整する数値を作ってを足したり引いたりすれば使えそうです。

    ではでは今週もこれにてノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】UnityでAudio機器が変更されたときに検知する方法について 

    こんにちは。
    大坂です。

    AudioMixerを使って音量の制御をしていた時に、
    Bluetoothイヤホンを接続したらアプリの設定で音量を0にしてたのにアプリ音が鳴るといわれたことがありました。

    解決策としては、AudioSettings.OnAudioConfigurationChangedを使うとAudio機器が変更されたのを検知できるみたいなので、
    Audio機器を変更を検知して、アプリで保存している音量を再セットしてあげる感じですかね。

    コード。

    [SerializeField] private AudioMixer mixser

    void Start() {
    AudioSettings.OnAudioConfigurationChanged += OnAudioConfigurationChanged;
    }

    void OnAudioConfigurationChanged(bool deviceWasChanged)
    {
    // 保存してた音量に設定する処理を書く
    mixser.SetFloat("BGM", {保存していた音量});
    }

    これで機器変更された時にも保存していた音量にできます。
    何かのお役に立てば!

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityでオブジェクトを連打すると処理が動くやーつ 

    こんにちは。
    今週からガガっと涼しくなるようですね。
    寒暖差が激しくて風邪ひきそう…そういえば花粉もなんか来てますよね。
    鼻水があれですわ。坂内っす。


    Unityで連打する機能とか作ってみた。
    オブジェクトを10回連打したら●●をする。
    みたいな機能です。


    [RepeatFunction.cs]


    using UnityEngine;
    using UnityEngine.EventSystems;

    public class RepeatFunction : MonoBehaviour, IPointerDownHandler
    {
    int arrivalCount = 10;
    float clickInterval = 0.25f;
    int tapCount;

    private float lastTapTime;

    public void OnPointerDown(PointerEventData eventData) {
    tapCount++;
    float currentTimeClick = eventData.clickTime;
    if (Mathf.Abs(currentTimeClick - lastTapTime) >= clickInterval) {
    tapCount = 1;
    }
    lastTapTime = currentTimeClick;

    if (tapCount >= arrivalCount) {
    Debug.Log("10回おしたよ");
    tapCount = 0;
    }
    }

    }



    arrivalCount : 連打する回数(何回連打すればいいのか)
    clickInterval : 連打間の制限時間(連打の速さ制限 これ以上早く連打しないといけない)

    上記コンポーネントをどこかのオブジェクトにつけるだけ。
    今回はただの白いImageにつけて実行してみたよ。



    こんな感じで動きます。

    何に使うかって?まぁ色々使えるんじゃないでしょうか・・・・・

    Androidとかの管理者向けオプションとかもこんな感じで解放できそうですもんね!

    何かで使うところがあったら使ってみてください。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0