カスタムコマンドの作成について

214 views
Skip to first unread message

Spider-Man

unread,
Jan 11, 2022, 6:56:16 AM1/11/22
to 宴ユーザーグループ
宴のバージョン: 宴3.11.2
UnityのバージョンとOS: Unity2020.3.25f1 Windows
Unityの習熟度:初めて一週間程度。C#は初めて触りました。

お世話になっております.
シナリオの選択肢を選んだログを保存し,Unityの外部からログにアクセスできるようにしたいと考えております.
そこで,カスタムコマンドを作成して,シナリオのある地点で任意の情報をMySQLにデータの追加をできるようにしようと考えました.
公式サイトの「カスタムコマンドの使い方」のプログラムを基に作成しましたが,以下のエラーメッセージがでました.

Assets\Utage\Sample\Scripts\EXMySQL.cs(2,7): error CS0246: The type or namespace name 'MySql' could not be found (are you missing a using directive or an assembly reference?)
Assets\Utage\Sample\Scripts\EXMySQL.cs(37,18): error CS0534: 'AdvCommandSQL' does not implement inherited abstract member 'AdvCommand.DoCommand(AdvEngine)'

作成したプログラムは下記の通りです.

using UnityEngine;
using MySql.Data.MySqlClient;
using System;

namespace Utage
{
    [AddComponentMenu("Utage/ADV/Examples/EXMySQL")]
    public class CustomCommandSQL : AdvCustomCommandManager
    {
        public override void OnBootInit()
        {
            Utage.AdvCommandParser.OnCreateCustomCommandFromID += CreateCustomCommand;
        }

        void OnDestroy()
        {
            Utage.AdvCommandParser.OnCreateCustomCommandFromID -= CreateCustomCommand;
        }

        //AdvEnginのクリア処理のときに呼ばれる
        public override void OnClear()
        {
        }

        //カスタムコマンドの作成用コールバック
        public void CreateCustomCommand(string id, StringGridRow row, AdvSettingDataManager dataManager, ref AdvCommand command)
        {
            switch (id)
            {
                case "SQL":
                    command = new AdvCommandSQL(row);
                    break;
            }
        }
    }

    public class AdvCommandSQL : AdvCommand
    {

        // 接続情報
        private static readonly string Server = "localhost";      // ホスト名
        private static readonly string Database = "database";       // データベース名
        private static readonly string Uid = "root";              // ユーザ名
        private static readonly string Pwd = "root";          // パスワード

        // 接続文字列
        private static readonly string ConnectionString = $"Server={Server}; Database={Database}; Uid={Uid}; Pwd={Pwd}";

        // データ登録SQL
        private static readonly string InsertTableSql = $"INSERT INTO record (name, time) VALUES (@name, @time)";

        static void Main(string[] args)
        {
            try
            {
                // コネクションオブジェクトとコマンドオブジェクトを生成します。
                using (var connection = new MySqlConnection(ConnectionString))
                using (var command = new MySqlCommand())
                {
                    // コネクションをオープンします。
                    connection.Open();

                    DateTime time = DateTime.Now;

                    // データ登録SQLを実行します。
                    command.Connection = connection;
                    command.CommandText = InsertTableSql;
                    command.Parameters.AddWithValue("@name", "名前");
                    command.Parameters.AddWithValue("@time", time.ToString("yyyy-MM-dd HH:mm:ss"));
                    var result = command.ExecuteNonQuery();
                    // データ登録できない場合
                    if (result != 1)
                    {
                        Console.WriteLine("データが登録できませんでした。");
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            Console.ReadKey();
        }
    }
   
}


宴でのMySQLの使用法について教えていただきたいです.
また,カスタムコマンドの作成方法がわから,2つ目のエラーについても教えていただけるとありがたいです.

何卒よろしくお願いいたします.

マッドネスラボ

unread,
Jan 11, 2022, 7:55:40 AM1/11/22
to 宴ユーザーグループ
MySQLの使い方に関しては、 私も詳しくないです。
ここは宴の使い方に対してのQ&Aなので、申し訳ないですが一般的なC#のプログラム方法やUnityの使い方に関してはこちらでサポートできません。

1つ目は、エラーを見る限りは、おそらくMySQLのライブラリがそもそもUnityのプロジェクトにインポートされてないのだと思いますが、詳しくはこちらではサポートできません。
「Unity MySQL」とかで検索するなりして、一般的なプログラミングの方法を調べてください。

2つ目のエラーは、カスタムコマンドに必要なDoCommandというメンバ関数が定義されていないため起きます。
    //コマンド実行
    public override void DoCommand(AdvEngine engine)
    {
//        Debug.Log(”コマンド実行”);
    }
 
とかを書き加えてみてください。
DoCommandは、宴のシナリオ上でそのコマンドが呼ばれたときに実行するプログラムの内容を書く部分です。
なにもしない場合であっても、プログラム定義だけはしてください。
        static void Main(string[] args)の部分を

    public override void DoCommand(AdvEngine engine)

に書き換えればテストとしては動くかもしれません。
ですが、MySQLの使い方は私もわからないので、その点はご自分で調べてください。

2022年1月11日火曜日 20:56:16 UTC+9 Spider-Man:

Spider-Man

unread,
Jan 11, 2022, 8:54:29 PM1/11/22
to 宴ユーザーグループ
お世話になっております.

この度は,ご回答いただきありがとうございます.

2つ目のエラーについては教えていただいと通り,書き換えたところエラーメッセージが表示されなくなりました.
MySQLについては,ここで質問することではなかったです.申し訳ありませんでした.

引き続き自分で調べていこうと思います.
ありがとうございました.
2022年1月11日火曜日 21:55:40 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages