■Unity開発メモ用のWiki◎現在扱っていること・Unity全般・MMDからUnityへの変換してインポート・MMDの仕様把握・BlenderでMMDモデルのカスタム

目次


スクリプトでトグルをオンにする

参考:【Unity】uGUI Toggleの使い方, スクリプトからの操作, タブ機能の実装:https://hiyotama.hatenablog.com/entry/2015/07/05/0...

・Toggleは子オブジェクトとしてBackground(Image)、Checkmark(Image)、Label(Text)を持っている
・Group→複数ToggleをまとめたToggleのグループを作り、グループの中では1つのToggleしかisOn:trueになれない機能
スクリプト上でisOnの値を知る方法→Toggle.isOnプロパティで取得できる
 →上記のメソッドはToggleのOnValueChangedから呼び出している
OnValueChanged→ToggleのisOnが変わった時に、指定したオブジェクトのメソッドを呼び出す
 →コールバック(AddListener?)

コイカツのフリーH準備画面のトグルをスクリプトで操作する

以下の項目のトグルをGOLで操作する
  • H段階:初めて・不慣れ・慣れ・淫乱
  • 状態:安全日・危険日
  • 時間帯:朝・昼・夕方・夜

H段階のトグル操作(H段階の場合)

  • 基本的な流れ
・「GameObject.Find」でH段階に関するトグルまでのパスを取得する
・トグルまでのパスとその途中にあるオブジェクトの説明
 「FreeHScene(フリーHシーンの準備画面に関するアレコレ?)」→「Canvas(描画関連)」→「Panel(パネル)」
 →「Normal(行為選択の通常を選んだ場合)」→「Stage(H段階)」→「Group(トグルグループ)」
 →「First(初めて)」「Inexperience(不慣れ)」「Experience(慣れ)」「Lewdness(淫乱)」
・「GetComponent<Toggle>()」でトグルのコンポーネントを取得する
・「.isOn = true」にする事で対象のトグルだけがオンになる

  • 仕様
・このGOlマクロが呼ばれた場合、H段階はランダムで選ばれる
・4段階あるH段階は以下の確率とする
  1. 初めて:10%
  2. 不慣れ:20%
  3. 慣れ:50%
  4. 淫乱:20%

「Random.Range(0, 101);」で0〜100の範囲で乱数を作成する



                //***************************
                //慣れ度のランダム選択
                //処女
                var h_level_1 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/Stage/Group/First").GetComponent<Toggle>();
                //不慣れ
                var h_level_2 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/Stage/Group/Inexperience").GetComponent<Toggle>();
                //慣れ
                var h_level_3 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/Stage/Group/Experience").GetComponent<Toggle>();
                //淫乱
                var h_level_4 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/Stage/Group/Lewdness").GetComponent<Toggle>();

                int h_level_rnd = Random.Range(0, 101);
                if (h_level_rnd >= 0 && h_level_rnd <= 10)
                {
                    h_level_1.isOn = true;
                    UnityEngine.Debug.Log(":処女:" + h_level_rnd);
                }
                else if (h_level_rnd > 10 && h_level_rnd <= 30)
                {
                    h_level_2.isOn = true;
                    UnityEngine.Debug.Log(":不慣れ:" + h_level_rnd);
                }
                else if (h_level_rnd > 30 && h_level_rnd <= 80)
                {
                    h_level_3.isOn = true;
                    UnityEngine.Debug.Log(":慣れ:" + h_level_rnd);
                }
                else if (h_level_rnd > 80 && h_level_rnd <= 100)
                {
                    h_level_4.isOn = true;
                    UnityEngine.Debug.Log(":淫乱:" + h_level_rnd);
                }
                //***************************
安全日・危険日をランダムで選択
                //***************************
                //安全日・危険日をランダムで選択
                //安全日            
                var hoge_03 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/State/Group/Safe").GetComponent<Toggle>();
                //危険日
                var hoge_04 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/State/Group/Danger").GetComponent<Toggle>();

                int rnd = Random.Range(0, 2);
                if (rnd == 0)
                {
                    hoge_03.isOn = true;
                    UnityEngine.Debug.Log(":安全日:" + rnd);
                }
                else
                {
                    hoge_04.isOn = true;
                    UnityEngine.Debug.Log(":危険日:" + rnd);
                }
                //***************************
時間帯のランダム選択
                //***************************
                //時間帯のランダム選択
                //朝
                var time_1 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/TimeZone/Group/morning").GetComponent<Toggle>();
                //昼
                var time_2 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/TimeZone/Group/noon").GetComponent<Toggle>();
                //夕方
                var time_3 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/TimeZone/Group/evening").GetComponent<Toggle>();
                //夜
                var time_4 = GameObject.Find("FreeHScene/Canvas/Panel/Normal/TimeZone/Group/night").GetComponent<Toggle>();

                int time_rnd = Random.Range(0, 5);
                if (time_rnd == 0)
                {
                    time_1.isOn = true;
                    UnityEngine.Debug.Log(":朝:" + time_rnd);
                }
                else if (time_rnd == 1)
                {
                    time_2.isOn = true;
                    UnityEngine.Debug.Log(":昼:" + time_rnd);
                }
                else if (time_rnd == 2)
                {
                    time_3.isOn = true;
                    UnityEngine.Debug.Log(":夕方:" + time_rnd);
                }
                else if (time_rnd == 3)
                {
                    time_4.isOn = true;
                    UnityEngine.Debug.Log(":夜:" + time_rnd);
                }
                //***************************

フリーHスタート時のランダム化

・フリーHはUnityスクリプトでクリックをするのが上手くいかない
 →現状は「KKS_GamepadSupport.dll」プラグインで無理やり処理をしている

愛撫状態のランダム化

初期処理部分
using UnityEngine;
using UnityEngine.EventSystems;
//
using static KKAPI.SceneApi;

namespace FreeH_AUTO
{
    public class GameObjectListMacro
    {
        public static void MacroMain()
        {
            var objectName = "GOL_FreeH_Key_Binding";
            var shortcut = GameObject.FindObjectOfType<FreeH_AUTO>();
            if (!shortcut)
            {
                var go = GameObject.Find(objectName);
                while (go)
                {
                    GameObject.DestroyImmediate(go);
                    go = GameObject.Find(objectName);
                }

                shortcut = new GameObject("GOL_FreeH_Key_Binding").AddComponent<FreeH_AUTO>();
                GameObject.DontDestroyOnLoad(shortcut.gameObject);
            }
        }
    }

    //*********************
    //フリーHの自動化の処理
    public partial class FreeH_AUTO : MonoBehaviour
    {
        //*********************
        //変数の定義
        //初期化用
        bool ini_flag = false;
        GameObject i_chaF_001;
        ChaControl cha_chaF_001;
        //
        GameObject h_proc;
        HSceneProc h_hoge;
        //
        HFlag hflags;
        HSprite hsprite;

        //愛撫の子オブジェクト達を入れる配列
        Transform[] children_Aibu;

        //愛撫モーション切り替え用
        int Aibu_Motion = 0;

        //モーションアイコンの選択段階フラグ
        int ai_flag = 0;

        //選んだ種類(愛撫か?奉仕か?挿入か?)
        int ai_flag_num = 0;//

        void ini()
        {
            //
            i_chaF_001 = GameObject.Find("chaF_001");
            cha_chaF_001 = i_chaF_001.GetComponent<ChaControl>();
            if (GetLoadSceneName() == "H")
            {
                //フリーH時の「HFlag」と「HSprite取得」を取得
                h_proc = GameObject.Find("HSceneProc");
                h_hoge = h_proc.GetComponent<HSceneProc>();

                hflags = h_hoge.flags;
                hsprite = h_hoge.sprite;
            }

            //初期化フラグ
            ini_flag = true;


            //擬似的にクリック(愛撫)         
            var hoge_01 = GameObject.Find("Canvas/ActionMenu/Aibu");
            ExecuteEvents.Execute
            (
                target: hoge_01.gameObject,
                eventData: new PointerEventData(EventSystem.current),
                functor: ExecuteEvents.pointerClickHandler
            );
            ai_flag = 2;
            UnityEngine.Debug.Log("愛撫・初期ランダム化");

        }

        void Update()
        {

            //ロード中でもフェード中でもない
            if (GetIsNowLoadingFade() == false)
            {
                //Hシーンの時のみ処理する
                if (GetLoadSceneName() != "H" /*|| GetLoadSceneName() != "VRHScene"*/)
                {
                    ini_flag = false;
                }

                //Hシーンの時のみ処理する
                if (GetLoadSceneName() == "H" || GetLoadSceneName() == "VRHScene")
                {
                    //初期化
                    if (ini_flag == false)
                    {
                        ini();
                    }

                    //*************************
                    //モーション選択メニュー
                    if (ai_flag == 2)
                    {
                        //愛撫が選ばれた場合
                        if (ai_flag_num == 0) ai_aibu();

                        //モーション選択の進行段階
                        ai_flag = 3;
                    }
                    //*************************

                    //-----------
                    //デバッグ用キー(ai_flagのリセット用)
                    if (Input.GetKeyDown(KeyCode.J))
                    {
                        ai_flag = 2;

                        //擬似的にクリック(愛撫)            
                        var hoge_01 = GameObject.Find("Canvas/ActionMenu/Aibu");
                        ExecuteEvents.Execute
                        (
                            target: hoge_01.gameObject,
                            eventData: new PointerEventData(EventSystem.current),
                            functor: ExecuteEvents.pointerClickHandler
                        );
                    }

                }
            }
        }
    }
}
実際に愛撫のランダム化処理する部分
using UnityEngine;
using UnityEngine.EventSystems;
using TMPro;

namespace FreeH_AUTO
{
    public partial class FreeH_AUTO : MonoBehaviour
    {

        //*********************
        //愛撫系の処理
        void ai_aibu()
        {

            //愛撫のオブジェクトを取得
            var parent = GameObject.Find("Canvas/ActionSubMenu/Aibu/Viewport/AibuCategory");

            //目標のオブジェクトがアクティブでヌルでない場合
            if (parent != null)
            {
                // 子オブジェクト達を入れる配列の初期化
                children_Aibu = new Transform[parent.transform.childCount];
                for (int i = 0; i < parent.transform.childCount; i++)
                {
                    // GetChild()で子オブジェクトを取得
                    children_Aibu[i] = parent.transform.GetChild(i);
                }

                //ランダムで愛撫の選択
                //マップによって変わる愛撫数の最大数「parent.transform.childCount」
                int rnd = Random.Range(0, parent.transform.childCount);

                //現在のモーションと違う場合
                if (Aibu_Motion != rnd)
                {

                    //愛撫の種類を代入する
                    Aibu_Motion = rnd;

                    //疑似クリックの対象を取得
                    var aibu = children_Aibu[Aibu_Motion].transform.gameObject;

                    //選択された愛撫名の取得
                    GameObject child = aibu.transform.GetChild(1).gameObject;
                    GameObject child2 = child.transform.GetChild(0).gameObject;
                    UnityEngine.Debug.Log("選択された愛撫名::" + child2.GetComponent<TextMeshProUGUI>().text);

                    //疑似クリック開始
                    ExecuteEvents.Execute
                    (
                        target: aibu.gameObject,
                        eventData: new PointerEventData(EventSystem.current),
                        functor: ExecuteEvents.pointerClickHandler
                    );

                }
            }
        }
    }
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

【メニュー編集】

スカイリム関連

スカイリム関連


Menu

【メニュー編集】

スクリプト関連

フリーエリア

管理人/副管理人のみ編集できます