質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2658閲覧

UnityでMySqlを使いたいがPlatformNotSupportedExceptionが出る

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/08/25 09:46

編集2021/08/26 22:53

前提・実現したいこと

UnityでMySqlを使用しようとしています。
こちらのサイトを参考に、Api Compatibility Levelを「.NET Standard 2.0」に変更し、スクリプトを実行して動作確認――というところまで来ましたが、タイトルの通りエラーが発生しました。
サイトのコードをコピペし、SERVERなどの変数を自分のものに変更して、Sceneの空オブジェクトにアタッチして実行するとエラーになります。
ダウンロードするよう指示されている「MySql connector」では「netstandard2.0」フォルダの中身を使用しました。サイトでは「MySql.Data.dll」を入れるようにと指示されていましたが、私の環境ではそれだとエラーが出る為、フォルダ内の全ファイルをAssets/Pluginsに投入しています。
Unityエディター上でも、Windows用にビルドしたモノでも同じエラーが出ます。

そもそも参考にしているサイトの情報が6年前と古いのですが、同じような方法でアクセスするやり方の新しい情報が見当たらないのでこの方法を取っています。
このエラーが解決可能なのであればその方法を、不可能であれば他のやり方を教えて戴きたいです。
MySqlを使い始めたのがつい最近、しかも1か月前に躓いてから暫くやっていなかったほどなので、サーバーに関しては全くの初心者です。自力ではUnityからMySqlへと接続する方法が分かりません。

発生している問題・エラーメッセージ

PlatformNotSupportedException: Operation is not supported on this platform. System.Configuration.ClientConfigPaths..ctor (System.String exePath, System.Boolean includeUserConfig) (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.ClientConfigPaths.GetPaths (System.String exePath, System.Boolean includeUserConfig) (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.ClientConfigurationHost.get_ConfigPaths () (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.ClientConfigurationHost.GetStreamName (System.String configPath) (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.ClientConfigurationHost.get_IsAppConfigHttp () (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.Internal.DelegatingConfigHost.get_IsAppConfigHttp () (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.ClientConfigurationSystem..ctor () (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.ConfigurationManager.EnsureConfigurationSystem () (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) Rethrow as ConfigurationErrorsException: Configuration system failed to initialize System.Configuration.ConfigurationManager.EnsureConfigurationSystem () (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.ConfigurationManager.PrepareConfigSystem () (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) System.Configuration.ConfigurationManager.GetSection (System.String sectionName) (at <0e721f564ffa49e6b1d97ad7b9fda1f2>:0) MySql.Data.MySqlClient.MySqlConfiguration..cctor () (at <b57b71682166477899e3186c487d985b>:0) Rethrow as TypeInitializationException: The type initializer for 'MySql.Data.MySqlClient.MySqlConfiguration' threw an exception. MySql.Data.MySqlClient.Replication.ReplicationManager..cctor () (at <b57b71682166477899e3186c487d985b>:0) Rethrow as TypeInitializationException: The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception. MySql.Data.MySqlClient.MySqlConnection.Open () (at <b57b71682166477899e3186c487d985b>:0) MySqlTest+<SelectData>d__7.MoveNext () (at Assets/Scripts/MySql/MySqlTest.cs:41) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <29ad182faa3f478c9310d6a2e7143c15>:0) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) MySqlTest:Start() (at Assets/Scripts/MySql/MySqlTest.cs:21)

該当のソースコード

C#

1using UnityEngine; 2using System; 3using System.Collections; 4 5using MySql.Data; 6using MySql.Data.MySqlClient; 7 8public class MySqlTest : MonoBehaviour 9{ 10 11 string SERVER = "x.x.x.x"; 12 string DATABASE = "testdb"; 13 string USERID = "unity-ntss"; 14 string PORT = "3306"; 15 string PASSWORD = "password"; 16 string TABLENAME = "testtable"; 17 18 void Start() 19 { 20 21 StartCoroutine(SelectData()); 22 23 } 24 25 IEnumerator SelectData() 26 { 27 28 MySqlConnection con = null; 29 30 string conCmd = 31 "server=" + SERVER + ";" + 32 "database=" + DATABASE + ";" + 33 "userid=" + USERID + ";" + 34 "port=" + PORT + ";" + 35 "password=" + PASSWORD; 36 37 try 38 { 39 40 con = new MySqlConnection(conCmd); 41 con.Open(); // 当該エラーが出る場所 42 43 } 44 catch (MySqlException ex) 45 { 46 Debug.Log(ex.ToString()); 47 } 48 49 string selCmd = "SELECT * FROM " + TABLENAME + "LIMIT 0, 1200;"; 50 51 MySqlCommand cmd = new MySqlCommand(selCmd, con); 52 53 IAsyncResult iAsync = cmd.BeginExecuteReader(); 54 55 while (!iAsync.IsCompleted) 56 { 57 yield return 0; 58 } 59 60 MySqlDataReader rdr = cmd.EndExecuteReader(iAsync); 61 62 while (rdr.Read()) 63 { 64 if (!rdr.IsDBNull(rdr.GetOrdinal("ID"))) 65 { 66 Debug.Log ( "ID : " + rdr.GetString ("ID") ); 67 } 68 } 69 70 rdr.Close(); 71 rdr.Dispose(); 72 con.Close(); 73 con.Dispose(); 74 } 75}

※MySql側でユーザーからテーブル作成、データ追加まで

create user 'unity-ntss'@'%' identified 'password'; create database testdb; create table testdb.testtable (id int, name varchar(12)); insert into testdb.testtable values (1, 'NTSS-Test');

MySql側で問題は起きていません。

試したこと

・Api Compatibility Levelを「.NET 4.x」にし、Connectorの「4.8」フォルダの中身を投入すると、そもそも参照が足りないという旨のエラーが大量に出ます。
・ググってみましたが、出てくる情報はほとんどが「Json.NET」を使用した際に発生した、というものであり参考になりませんでした。また「MySql」を使用していたら起きたという情報でも、現象が「Unityエディター上では動作する」ということなので残念ながら解決には至りませんでした。

補足情報(FW/ツールのバージョンなど)

使用しているバージョン
Unity=2019.4.16f1 Personal
MySql=8.0.26(Connectorも同じ)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Unityから直接データベースの内容を取得するのではなく、PHPやASP.NETといったHTTPサーバー上で動作するものを経由させるのはどうでしょうか。
必要な知識は増えますが、Unity側ではUnityWebRequestを使えばHTTP通信自体は容易で、サーバー側もデータベースとのアクセスが楽なものを選べば、そこまで難しくないと思います。
また、Unityはクライアント側で使うことが多く、その場合は今回のような方法だと、データベースへアクセスするためのユーザー名やパスワードが筒抜けになり、セキュリティ上問題になります。
「読み込み用のユーザーを使う」などの方法が考えられなくはないですが、そこまで考慮するぐらいだったら、サーバー内からデータベースにアクセスするのが一般的ではないでしょうか。

なお、HTTPサーバー上のものについては、Webサーバーの仕組みを応用することが出来る(せいぜい、HTMLがJSONなどに変わるぐらい)ので、それを参考にするといいでしょう。

投稿2021/08/27 03:36

編集2021/08/27 03:42
fiveHundred

総合スコア9917

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/08/27 04:17

なるほど、やっぱり直接繋ぐのはセキュリティ的にも問題が出ますよね。 ご提示の方法であればdllをUnityに入れる必要もないですね。 勉強して頑張ってやってみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問