FC2ブログ
    03 «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.» 05

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

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

     

    【ハルシオンブログ】Dictionaryってキーを複数設定できるんですね 

    こんにちは。
    大坂です。

    Dictionaryってキーを複数設定できるんですね~。


    enum Test_1
    {
    Test_1_1,
    Test_1_2,
    Test_1_3,
    }

    enum Test_2
    {
    Test_2_1,
    Test_2_2,
    Test_2_3,
    }

    Dictionary<(Test_1, Test_2), int> testDic = new Dictionary<(Test_1, Test_2), int>();

    // Start is called before the first frame update
    void Start()
    {
    var key = (Test_1.Test_1_1, Test_2.Test_2_1);
    testDic[key] = 10;

    Debug.Log(testDic[key]);
    }


    2個のキーで一意にしたいときもあるので、知っていると便利ですね。

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】ちょっと便利なエディター拡張  一括でオブジェクト名の前とか後に文字列追加するやーつ 

    ハルシオンブログへようこそ。
    本日も役に立たないようなよくわからない記事を書いていきます。坂内っす。

    今回は素敵なエディタ拡張を発見したので紹介。



    こんな感じで、選択したオブジェクト以下のオブジェクト名を一括で変更するやつ。

    こんなコードをEditor以下に置きます。

    [PrefixAdder.cs]

    using UnityEngine;
    using UnityEditor;

    public class PrefixAdder : ScriptableWizard {
    [SerializeField] string prefix;
    [SerializeField] string subfix;

    [MenuItem("UITools/オブジェクト名追加ツール", false)]
    static bool CreateWizardValidator() {
    Transform[] transforms = Selection.GetTransforms(SelectionMode.ExcludePrefab);
    return transforms.Length >= 1;
    }

    [MenuItem("UITools/オブジェクト名追加ツール", false)]
    static void CreateWizard() {
    ScriptableWizard.DisplayWizard("オブジェクト名追加ツール", typeof(PrefixAdder), "リネーム",
    "閉じる");
    }

    void OnWizardCreate() {
    ApplyPrefix();
    }

    void ApplyPrefix() {
    GameObject[] gos = Selection.gameObjects;
    foreach (GameObject go in gos) {
    var parent = go.GetComponentInParent(typeof(Transform));
    var children = go.GetComponentsInChildren(typeof(Transform));

    //子のリネーム
    foreach (Transform child in children) {
    Undo.RegisterCompleteObjectUndo(child.gameObject,
    "Added: " + (string.IsNullOrEmpty(prefix) ? "" : prefix + " ") +
    (string.IsNullOrEmpty(subfix) ? "" : subfix));

    if (child == go.transform)
    continue;

    if (!string.IsNullOrEmpty(prefix)) {
    child.name = prefix + child.name;
    }
    if (!string.IsNullOrEmpty(subfix)) {
    child.name = child.name + subfix;
    }
    }

    if (!string.IsNullOrEmpty(prefix)) {
    parent.name = prefix + parent.name;
    }
    if (!string.IsNullOrEmpty(subfix)) {
    parent.name = parent.name + subfix;
    }

    }
    }

    void OnWizardOtherButton() {
    this.Close();
    }

    void OnWizardUpdate() {
    Transform[] transforms = Selection.GetTransforms(SelectionMode.ExcludePrefab);
    errorString = "";
    isValid = true;

    if (transforms.Length < 1) {
    errorString += "オブジェクトを選択してください。";
    }
    isValid = string.IsNullOrEmpty(errorString);

    }

    void OnSelectionChange() {
    OnWizardUpdate();
    }
    }


    ここから起動できます。



    使うことあるかもしれませんね!

    ちょっと便利なエディター拡張の紹介でした!


    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】秒、ミリ秒をTimeSpanにするとき 

    こんにちは。
    大坂です。

    秒、ミリ秒をTimeSpanにするときのお話。
    FromSecondsやFromMillisecondsなんかを使うと便利っていうだけです。


    int sec = 200;
    int milliSec = 100000;

    TimeSpan fromSec = TimeSpan.FromSeconds(sec);
    TimeSpan fromMilliSec = TimeSpan.FromMilliseconds(milliSec);

    Debug.Log($"秒:{fromSec.ToString(@"mm\:ss")}");
    Debug.Log($"ミリ秒:{fromMilliSec.ToString(@"mm\:ss")}");




    簡単に変換できますね。
    ゲームでスキルのクールタイムなどを作るときに便利ですかね。

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unityにプリセット機能なんてあったんだ!?なかなか使いやすそうな機能ですね! 

    来週からGWなんですね。
    ちょー時間が経つのが早くてビビり散らかしてます。
    坂内っす。

    そういえば今まで使ってなかったのですが、Unityのプリセット機能って使ってますか?

    例えば、Cubeをこんな感じにします。


    大きさを0.5にして、マテリアルを変えました。

    Transformコンポーネントのここのスクロールバーみたいなアイコンを押すと、プリセットウインドウが出ます。



    ウインドウの下にある「Save current to...」を押して、プリセット名を入力して保存をすると、プリセットが保存されます。

    その後Cubeを新規で作成した際に、この時保存したプリセットを選ぶと、そのコンポーネントがプリセットとして指定されます。



    今回はTransformのプリセットなので、位置・スケール・ローテートの3個が即座に指定されました。

    また、作成されたプリセットファイルの「Add to Transform default」を押すと、プロジェクトのデフォルトとして指定されます。(この場合はTransformだけ)




    以後作成されるオブジェクトは上記プリセットのサイズで作成されるようになります。

    ということで、プリセットの簡単な説明でした!
    使ったことない機能で素敵な機能いっぱいありますね!

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unity2021.2からProjectでプレハブを消すときにDelete and Unpackが増えてた 

    こんにちは。
    大坂です。

    Unity2021.2からProjectでプレハブを消すとき Delete and Unpack なんていうのが増えたんですね。
    今まではDeleteしかなくて、Projectのプレハブを消すときは、Hierarchyで対象のプレハブをUnpackしてからProjectで消すという手順が必要でしたが、Projectで消すだけでよくなったので少し便利になりました。





    Test_1がMissingPrefabにならずにプレハブが解除されてます。
    細かいところの変更ですが、ちょっと手間が省けてよいですね。

    ではまたノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】timeScaleの影響を受けないUnscaledDeltaTimeを使う 

    おはようございます。坂内っす。

    Unityで処理の早送りをするのにこんなことをしたりしてます。

    Time.timeScale = 2f;

    2倍速の処理になりますよね。

    色々なものが2倍の速度になってしまい困るって時。

    timeScaleの影響を受けないようにするには「Time.UnscaledDeltaTime」を使います。

    分かりやすいようにこんな画面作ってみました。


    上の0がtimer1
    下の0がtimer2

    スライダーはtimeScaleをいじれるようになってます。

    [Blog20220411.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20220411 : MonoBehaviour
    {
    [SerializeField] Text lbl1;
    [SerializeField] Text lbl2;
    [SerializeField] Text lblScale;
    [SerializeField] Slider sldTimeScale;
    [SerializeField] Button btnStart;

    float timer1 = 0f;
    float timer2 = 0f;

    bool isStart;

    void Start()
    {
    lblScale.text = Time.timeScale.ToString();
    sldTimeScale.onValueChanged.AddListener(OnChangeSlider);
    btnStart.onClick.AddListener(OnClickButton);
    }

    void Update()
    {
    if (!isStart) {
    return;
    }
    timer1 += Time.deltaTime;
    timer2 += Time.unscaledDeltaTime;
    lbl1.text = timer1.ToString();
    lbl2.text = timer2.ToString();
    }

    void OnChangeSlider(float value) {
    lblScale.text = value.ToString();
    Time.timeScale = value;
    }

    void OnClickButton() {
    isStart = true;
    }
    }



    スタートボタンを押したらカウントが始まる感じです。



    こんな感じで、timeScaleを変えてもunscaledDeltaTimeで計算している方は速度が変わらないのが分かります。

    ということで、timeScaleをいじっても変わらないdeltaTimeのお話でした。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】prefabのrootに飛ぶショートカット 

    こんにちは。
    大坂です。

    プレハブモードで編集してるときは特に問題ないですが、Hierarchyで階層が深いprefabを編集した時に編集してるオブジェクトとは別のオブジェクトもあったりして、prefabのrootを探すのが面倒なときがあります。

    そんな時は「ctrl+shift+R」を押すとrootに飛んでくれます。

    ちゃんと飛んでくれますね。
    あんまり深く作ることもないかもしれませんが、知っていると少し役に立ちますね。

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

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    【ハルシオンブログ】Unity DotweenのDoMove系を絶対ではなく相対で動かしたい時 

    こんにちは。雨の時期になりましたね。
    外行くの億劫になる毎日・・・・まぁ家から出ないんですけど。坂内です。

    UnityのDotweenのMove系を使った際に、「今の座標から●●動かす」という処理を行いたいが、想定した動きにならないってことありませんか?

    例えば、こんな感じでボタンとイメージを置き、ボタンを押すごとにイメージを少しずつ上に移動したいって時。


    こんなコードを書いてみたり。

    [Blog20220404.cs]

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

    public class Blog20220404 : MonoBehaviour
    {
    [SerializeField] Button btnMove;
    [SerializeField] Image imgObject;

    void Start()
    {
    btnMove.onClick.AddListener(MoveObject);
    }

    void MoveObject() {
    imgObject.transform.DOLocalMoveY(1f, 0.6f);
    }

    }



    ボタンを押すと、Yを1上に動かす、といった処理。



    いや、そうじゃない。そうなんだけど・・・・

    DOLocalMoveは「引数1の場所に、引数2の時間を使って移動」なので、こうなっちゃいますよね。

    やりたいのは、「ボタンを押すと引数1の分移動」なわけで、目的座標として使いたいわけではないのですが・・・・・

    そんな時は、SetRelativeをつけましょう。

    [Blog20220404.cs]

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

    public class Blog20220404 : MonoBehaviour
    {
    [SerializeField] Button btnMove;
    [SerializeField] Image imgObject;

    void Start()
    {
    btnMove.onClick.AddListener(MoveObject);
    }

    void MoveObject() {
    imgObject.transform.DOLocalMoveY(1f, 0.6f).SetRelative();
    }

    }





    一応動いてますが・・・・移動量すくないっすね。

    SetRelativeはいわゆる相対的になる感じですね。

    SetRelativeを付けないときは「引数1へ移動」だったのが、SetRelativeをつけると「引数1分移動」になりました。

    ただし、相対量が1fだったため、ちょっと動いているのが分かりずらいですが・・・・

    imgObject.transform.DOLocalMoveY(20f, 0.6f).SetRelative();

    20くらいにするとこんな感じに動きます。



    ということで、DoTweenの絶対値挙動をを相対値の挙動に変えるには、SetRelativeを使うという話でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0