DJProject_備忘録_4

## 2024-11-12
- PythonのPlayerのUdonSharp化
    - QRCodeModePlayerの変換
        - 確認
        - 修正
        - 確認
  
    - QRCodeCharacterCountPlayerの変換
        - 確認
        - 修正

    - QRCodeBitConversionPlayerの変換
        - UdonSharp用に簡易的な独自のNumpy(RinaNumpy)をimportする形で変換。
        - RinaNumpyに新しいメソッドを追加。

## 2024-11-13
- U#変換の続き
    - ChecksumPlayerの変換
        - 前回のChatGPTインスタンス「
        https://chatgpt.com/g/g-kuufVcS5H-miraitoriko/c/67325684-52c0-8012-9905-c5252b4a47b1
        」(Masarina用)
        の最後のメッセージを
        削除、質問、削除、質問…と繰り返す形で作成していく。

    - e_QRCodeTerminationPlayerDirの削除（使わないプレイヤーだったため）
        - 確認
        - 修正

    - PolynomialDivisionPlayerの変換
        - このプレイヤーは、プレイヤーとしては使いませんが、ライブラリとして扱います。

    - やるべきことを一度まとめる
        - efghijkl2_ChecksumPlayerDirの確認がまだ。
        - j_PolynomialDivisionPlayerDirの確認がまだ。

- 2024-11-13
    - PyToU#変換の続き
        - の
        Convert.ToInt32はU#で使えないので、
        ```
        public int BitStringToInt(string bitString)
        {
            int result = 0;
            for (int i = 0; i < bitString.Length; i++)
            {
                if (bitString[i] == '1')
                {
                    result += (1 << (bitString.Length - i - 1));  // ビットシフトを使って各桁を加算
                }
            }
            return result;
        }

        ```
        で代用。RinaNumpyに追加した。
        確認完了。

        - ChecksumPlayer の変換の確認
        なんかおかしい。
        CharGPTに頼らず、時間をかけて上から一つ一つみていく必要がある。
            - このプレイヤーのpyとU#の比較
            - 

## 2024-11-15
何してたんだっけ、、状況把握から、、。
あ、そうだたしかにSystemライブラリのメソッド使ってから、修正したんだ、、。
- へんかんのつづき
    -　ChecksumPlayerの修正
    ```
    ArrayToString メソッドの修正
    修正理由: += を使った文字列の連結は、UdonSharpでは最適ではありません。StringBuilderもサポートされていないので、別のアプローチが必要です。
    修正内容: 各配列要素を直接つなげる代わりに、あらかじめサイズを指定した配列を作り、要素をまとめる。
    AppendChecksum メソッドの修正
    修正理由: Array.Copy が使えないため、直接配列をコピーする必要があります。
    修正内容: 新しい配列を作成し、手動で要素をコピーします。
    Debug.Log 出力の最適化
    修正理由: 長い文字列を生成する部分があるため、ここも効率的に処理する必要があります。

    ```
    との事なので、上から修正していく。
    ああ、1番上のやつは、+=とかjoinはUdonSharpでは使えないから、ループコピーで対処するべきだというやつだね。
    ジャグ配列系のコピーメソッドはRinaNumpyで作成済みだから、それを使おう。

## 2024-11-15
- ChecksumPlayerの修正
    ```
    ArrayToString メソッドの修正
    修正理由: += を使った文字列の連結は、UdonSharpでは最適ではありません。StringBuilderもサポートされていないので、別のアプローチが必要です。
    修正内容: 各配列要素を直接つなげる代わりに、あらかじめサイズを指定した配列を作り、要素をまとめる。
    AppendChecksum メソッドの修正
    修正理由: Array.Copy が使えないため、直接配列をコピーする必要があります。
    修正内容: 新しい配列を作成し、手動で要素をコピーします。
    Debug.Log 出力の最適化
    修正理由: 長い文字列を生成する部分があるため、ここも効率的に処理する必要があります。

    ```
    との事なので、上から修正していく。
    修正箇所の質問は、1度に聞くのではなく、次のように…
    ![IMG_0044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910368/5c1f2c5a-1127-78a7-a793-71a284060e75.png)

    …メソッド毎に聞いていく。
    なお、質問する直前にRinaNumpy.csを渡しているので、RinaNumpyライブラリも含めて思考させている。
    このプレイヤーの修正完了

- プレイヤーのU#化のつづき
    - QRCodeMapInitializerPlayerの変換
       一旦作るせてから、RinaNumpyで賄えるところは賄う形で"修正する形"でchatGPTに頼むと素晴らしい。
       みよ、素晴らしくUdonSharpに対応したコードができる。
    ```
    using UdonSharp;
    using UnityEngine;
    
    public class QRCodeMapInitializerPlayer : UdonSharpBehaviour
    {
        // メンバ変数(Pythonのインスタンス変数に相当)
        public int Version = 2; // QRコードのバージョン
        public int GridSize = 25; // QRコードのグリッドサイズ
        public float[] ModeCharNumInfoChecksumBitlist; // モード/文字数情報/チェックサムのビットリスト
    
        // RinaNumpyをアタッチ
        public RinaNumpy rinaNumpy; // Unityエディタでアタッチすることを想定
    
        // 依存するプレイヤー
        public UdonSharpBehaviour ChecksumPlayer; // Unityでアタッチすることを想定
    
        // 自分の名前を返すメソッド
        public string ReturnMyName()
        {
            return "QRCodeMapInitializerPlayer";
        }
    
        // メイン処理
        public string ExecuteMain()
        {
            /*
             * UnityエディタでChecksumPlayerとRinaNumpyInstanceをアタッチすることを前提に処理を進める
             */
    
            // ChecksumPlayerからデータを取得
            QRCodeMapInitializerPlayer checksumPlayer = (QRCodeMapInitializerPlayer)ChecksumPlayer;
            ModeCharNumInfoChecksumBitlist = checksumPlayer.ModeCharNumInfoChecksumBitlist;
    
            // RinaNumpyを活用した処理例: 配列の正規化
            float mean = rinaNumpy.Mean_FloatArray(ModeCharNumInfoChecksumBitlist);
            float std = rinaNumpy.Std_FloatArray(ModeCharNumInfoChecksumBitlist);
            ModeCharNumInfoChecksumBitlist = rinaNumpy.Subtract_FloatArray_Float(ModeCharNumInfoChecksumBitlist, mean);
            ModeCharNumInfoChecksumBitlist = rinaNumpy.Divide_FloatArray_Float(ModeCharNumInfoChecksumBitlist, std);
    
            // 実行の確認用メッセージ
            Debug.Log($"{ReturnMyName()}が実行されました。");
            Debug.Log($"Version: {Version}, GridSize: {GridSize}");
            Debug.Log($"Normalized ModeCharNumInfoChecksumBitlist: {ModeCharNumInfoChecksumBitlist}");
    
            // プレイヤー自身を更新する処理
            return "Completed";
        }
    }
    ```
    - QRCodeTimingPatternPlayer
    変換、修正やった。
    これまでに変換したもの、大丈夫かな、、心配になってきた。
    とくにResetとか、絶対だめだ、、、。やはりスマホでは限界。
    家で時間が空いたらUnityデバッグしなきゃ。

    とりあえず作ってきた変換してきた全てのプレイヤーに、
    ```
    public bool 名前 + "Return()"
    {
        return true;
    }
    ```
    って書き込んでおいた。