यूनिटी 3 डी और माईएसक्यूएल


आज हम यह पता लगाएंगे कि Unity3D पर किसी प्रोजेक्ट को MySQL डेटाबेस से कैसे जोड़ा जाए।


अधिक सटीक रूप से, हम विश्लेषण करेंगे कि डेटाबेस में गेम ऑब्जेक्ट की स्थिति को कैसे बचाया जाए, और फिर उन्हें डेटाबेस से लोड किया जाए। गाइड जोनाथन वुड की यूनिटी 3.0.0f5 और MySQL 5.2.28 पर आधारित है। यह एकता के 4 वें संस्करण के लिए पूरक और अनुकूलित है।

हमें आवश्यकता होगी:
1. यूनिटी 3 डी 4. एक्स।
2. MySQL डेटाबेस तक पहुंच।
3. पुस्तकालय MySql.Data.dll।

प्रोजेक्ट फ़ोल्डर में, आपको लाइब्रेरी डायरेक्टरी बनाने की आवश्यकता होती है जिसमें आपको MySQL.Data.dll लाइब्रेरी को रखने की आवश्यकता होती है। इसे इस संग्रह से डाउनलोड किया जा सकता है, लेकिन यदि आपके पास पहले से ही MySQL स्थापित है, तो आप c: \ Program Files (x86) \ MySQL \ MySQL कनेक्टर Net 6.0.3 \ Assemblies \ से कॉपी कर सकते हैं।

असेंबली संस्करण संगतता समस्याओं से बचने के लिए, साथ ही साथ अपने आप को कई घंटों के समय और नसों को बचाने के लिए ( जोएल के लिए धन्यवाद), संगतता एपीआई स्तर संपादित करें -> प्रोजेक्ट सेटिंग्स -> प्लेयर -> अनुकूलन -> एपीआई संगतता स्तर = .NET 2.0।


प्रारंभिक कार्य:

1. जिन वस्तुओं को सहेजने की आवश्यकता होती है, उन्हें "सेवेबल" टैग से चिह्नित किया जाता है।

2. डेटाबेस में एक तालिका बनाएं जिसमें वस्तुओं के बारे में जानकारी संग्रहीत की जाएगी।

नई लाइब्रेरी का उपयोग स्क्रिप्ट की शुरुआत में करने के लिए करें:
using MySql.Data; using MySql.Data.MySqlClient; 


और एक चर में कनेक्शन मापदंडों को लिखना भी न भूलें:
  // MySQL  string constr = "Server=localhost;Database=demo;User ID=demo;Password=demo;Pooling=true;CharSet=utf8;"; 


हम एक संरचना बनाते हैं जिसमें वस्तुओं के बारे में जानकारी संग्रहीत की जाएगी:
  //       string ID, Name, levelname, objectType; float posx, posy, posz, tranx, trany, tranz; //     public struct data { public int UID; public string ID, Name, levelname, objectType; public float posx, posy, posz, tranx, trany, tranz; } //          List<data> _GameItems; 


स्टार्टअप पर, स्क्रिप्ट डेटाबेस से कनेक्ट होती है, और जब बंद हो जाती है, तो यह डिस्कनेक्ट हो जाती है:
  void Awake() { try { //    con = new MySqlConnection(constr); // ,      con.Open(); Debug.Log("Connection State: " + con.State); } catch (IOException ex) {Debug.Log(ex.ToString());} } void OnApplicationQuit() { Debug.Log("killing con"); if (con != null) { // ,  : // if (con.State != ConnectionState.Closed) //  -        if (con.State.ToString()!="Closed") con.Close(); con.Dispose(); } } 


मंच पर वस्तुओं के साथ काम करने के लिए दो प्रक्रियाएं जिम्मेदार हैं:
prepDate - डेटाबेस में लिखने के लिए डेटा तैयार करता है
 ///         void prepData() { bodies = GameObject.FindGameObjectsWithTag("Savable"); _GameItems = new List<data>(); data itm; foreach (GameObject body in bodies) { itm = new data(); itm.ID = body.name + "_" + body.GetInstanceID(); itm.Name = body.name; itm.levelname = Application.loadedLevelName; itm.objectType = body.name.Replace("(Clone)", ""); itm.posx = body.transform.position.x; itm.posy = body.transform.position.y; itm.posz = body.transform.position.z; itm.tranx = body.transform.rotation.x; itm.trany = body.transform.rotation.y; itm.tranz = body.transform.rotation.z; _GameItems.Add(itm); } Debug.Log("Items in collection: " + _GameItems.Count); } } 

loadDate - दृश्य पर वस्तुओं को लोड करता है
 ///        void loadData() { //       bodies = GameObject.FindGameObjectsWithTag("Savable"); DestroyObject(bodies); //      if (_GameItems != null) { if (_GameItems.Count > 0) { foreach (data itm in _GameItems) { if (itm.objectType="CUBE") {Instantiate(mCUBE, new Vector3(itm.posx, itm.posy , itm.posz),Quaternion.Euler(itm.tranx, itm.trany, itm.tranz));} else if (itm.objectType="SPHERE") {Instantiate(mSPHERE, new Vector3(itm.posx, itm.posy , itm.posz),Quaternion.Euler(itm.tranx, itm.trany, itm.tranz));} else if (itm.objectType="TRIANGLE") {Instantiate(mTRIANGLE, new Vector3(itm.posx, itm.posy , itm.posz),Quaternion.Euler(itm.tranx, itm.trany, itm.tranz));} } } } } } 


और डेटाबेस के साथ काम करने के लिए जिम्मेदार चार मुख्य प्रक्रियाएं:
InsertEntries - तालिका में एक नया रिकॉर्ड डालें।
 //      void InsertEntries() { prepData(); string query = string.Empty; //   try { query = "INSERT INTO demo_table (ID, Name, levelname, objectType, posx, posy, posz, tranx, trany, tranz) VALUES (?ID, ?Name, ?levelname, ?objectType, ?posx, ?posy, ?posz, ?tranx, ?trany, ?tranz)"; if (con.State.ToString()!="Open") con.Open(); using (con) { foreach (data itm in _GameItems) { using (cmd = new MySqlCommand(query, con)) { MySqlParameter oParam = cmd.Parameters.Add("?ID", MySqlDbType.VarChar); oParam.Value = itm.ID; MySqlParameter oParam1 = cmd.Parameters.Add("?Name", MySqlDbType.VarChar); oParam1.Value = itm.Name; MySqlParameter oParam2 = cmd.Parameters.Add("?levelname", MySqlDbType.VarChar); oParam2.Value = itm.levelname; MySqlParameter oParam3 = cmd.Parameters.Add("?objectType", MySqlDbType.VarChar); oParam3.Value = itm.objectType; MySqlParameter oParam4 = cmd.Parameters.Add("?posx", MySqlDbType.Float); oParam4.Value = itm.posx; MySqlParameter oParam5 = cmd.Parameters.Add("?posy", MySqlDbType.Float); oParam5.Value = itm.posy; MySqlParameter oParam6 = cmd.Parameters.Add("?posz", MySqlDbType.Float); oParam6.Value = itm.posz; MySqlParameter oParam7 = cmd.Parameters.Add("?tranx", MySqlDbType.Float); oParam7.Value = itm.tranx; MySqlParameter oParam8 = cmd.Parameters.Add("?trany", MySqlDbType.Float); oParam8.Value = itm.trany; MySqlParameter oParam9 = cmd.Parameters.Add("?tranz", MySqlDbType.Float); oParam9.Value = itm.tranz; cmd.ExecuteNonQuery(); } } } } catch (IOException ex) { Debug.Log(ex.ToString()); } finally {} } 

UpdateEntries - एक टेबल में मौजूदा रिकॉर्ड अपडेट करें।
  //      void UpdateEntries() { prepData(); string query = string.Empty; //   try { query = "UPDATE demo_table SET ID=?ID, Name=?Name, levelname=?levelname, objectType=?objectType, posx=?posx, posy=?posy, posz=?posz, tranx=?tranx, trany=?trany, tranz=?tranz WHERE iddemo_table=?UID"; if (con.State.ToString()!="Open") con.Open(); using (con) { foreach (data itm in _GameItems) { using (cmd = new MySqlCommand(query, con)) { MySqlParameter oParam = cmd.Parameters.Add("?ID", MySqlDbType.VarChar); oParam.Value = itm.ID; MySqlParameter oParam1 = cmd.Parameters.Add("?Name", MySqlDbType.VarChar); oParam1.Value = itm.Name; MySqlParameter oParam2 = cmd.Parameters.Add("?levelname", MySqlDbType.VarChar); oParam2.Value = itm.levelname; MySqlParameter oParam3 = cmd.Parameters.Add("?objectType", MySqlDbType.VarChar); oParam3.Value = itm.objectType; MySqlParameter oParam4 = cmd.Parameters.Add("?posx", MySqlDbType.Float); oParam4.Value = itm.posx; MySqlParameter oParam5 = cmd.Parameters.Add("?posy", MySqlDbType.Float); oParam5.Value = itm.posy; MySqlParameter oParam6 = cmd.Parameters.Add("?posz", MySqlDbType.Float); oParam6.Value = itm.posz; MySqlParameter oParam7 = cmd.Parameters.Add("?tranx", MySqlDbType.Float); oParam7.Value = itm.tranx; MySqlParameter oParam8 = cmd.Parameters.Add("?trany", MySqlDbType.Float); oParam8.Value = itm.trany; MySqlParameter oParam9 = cmd.Parameters.Add("?tranz", MySqlDbType.Float); oParam9.Value = itm.tranz; cmd.ExecuteNonQuery(); } } } } catch (IOException ex) {Debug.Log(ex.ToString());} finally {} } 

DeleteEntries - तालिका से रिकॉर्ड हटाएं।
 //     void DeleteEntries() { string query = string.Empty; //   try { //      ID ,    //----------------------------------------------------------------------- // query = "DELETE FROM demo_table WHERE iddemo_table=?UID"; // MySqlParameter oParam = cmd.Parameters.Add("?UID", MySqlDbType.Int32); // oParam.Value = 0; //----------------------------------------------------------------------- query = "DELETE FROM demo_table WHERE iddemo_table"; if (con.State.ToString()!="Open") con.Open(); using (con) { using (cmd = new MySqlCommand(query, con)) { cmd.ExecuteNonQuery(); } } } catch (IOException ex) {Debug.Log(ex.ToString());} finally {} } 

ReadEntries - तालिका से सभी रिकॉर्ड पढ़ें।
 //      void ReadEntries() { string query = string.Empty; if (_GameItems == null) _GameItems = new List<data>(); if (_GameItems.Count > 0) _GameItems.Clear(); //   try { query = "SELECT * FROM view_demo"; if (con.State.ToString()!="Open") con.Open(); using (con) { using (cmd = new MySqlCommand(query, con)) { rdr = cmd.ExecuteReader(); if(rdr.HasRows) while (rdr.Read()) { data itm = new data(); itm.UID = int.Parse(rdr["iddemo_table"].ToString()); itm.ID = rdr["ID"].ToString(); itm.levelname = rdr["levelname"].ToString(); itm.Name = rdr["Name"].ToString(); itm.objectType = rdr["objectType"].ToString(); itm.posx = float.Parse(rdr["posx"].ToString()); itm.posy = float.Parse(rdr["posy"].ToString()); itm.posz = float.Parse(rdr["posz"].ToString()); itm.tranx = float.Parse(rdr["tranx"].ToString()); itm.trany = float.Parse(rdr["trany"].ToString()); itm.tranz = float.Parse(rdr["tranz"].ToString()); _GameItems.Add(itm); } rdr.Dispose(); } } } catch (IOException ex) {Debug.Log(ex.ToString());} finally {} } 



दृश्य को लोड करने और सहेजने के लिए सभी कुछ बटन बनाना है:
  //     void OnGUI() { if (GUI.Button(new Rect(10, 70, 50, 30), "Save") && !saving) { saving = true; //     DeleteEntries(); //      InsertEntries(); //       ID    saving = false; } if (GUI.Button(new Rect(10, 110, 50, 30), "Load") && !loading) { loading = true; //     ReadEntries(); //    loadData(); //      LogGameItems(); loading = false; } } 


वह मूल रूप से यह है। टिप्पणियों और टिप्पणियों का स्वागत है।

पूरी पटकथा
 using UnityEngine; using MySql.Data; using MySql.Data.MySqlClient; using System.IO; using System.Collections; using System.Collections.Generic; public class MySQLCS : MonoBehaviour { public GameObject mCUBE; public GameObject mSPHERE; public GameObject mTRIANGLE; bool saving = false; bool loading = false; // MySQL  string constr = "Server=localhost;Database=demo;User ID=demo;Password=demo;Pooling=true;CharSet=utf8;"; //  MySqlConnection con = null; //    MySqlCommand cmd = null; //  MySqlDataReader rdr = null; //  MySqlError er = null; //     GameObject[] bodies; //       string ID, Name, levelname, objectType; float posx, posy, posz, tranx, trany, tranz; //     public struct data { public int UID; public string ID, Name, levelname, objectType; public float posx, posy, posz, tranx, trany, tranz; } //          List<data> _GameItems; void Awake() { try { //    con = new MySqlConnection(constr); // ,      con.Open(); Debug.Log("Connection State: " + con.State); } catch (IOException ex) {Debug.Log(ex.ToString());} } void OnApplicationQuit() { Debug.Log("killing con"); if (con != null) { // ,  : // if (con.State != ConnectionState.Closed) //  -        if (con.State.ToString()!="Closed") con.Close(); con.Dispose(); } } // Use this for initialization void Start() { } // Update is called once per frame void Update() { } //     void OnGUI() { if (GUI.Button(new Rect(10, 70, 50, 30), "Save") && !saving) { saving = true; //     DeleteEntries(); //      InsertEntries(); //       ID    saving = false; } if (GUI.Button(new Rect(10, 110, 50, 30), "Load") && !loading) { loading = true; //     ReadEntries(); //    loadData(); //      LogGameItems(); loading = false; } } //      void InsertEntries() { prepData(); string query = string.Empty; //   try { query = "INSERT INTO demo_table (ID, Name, levelname, objectType, posx, posy, posz, tranx, trany, tranz) VALUES (?ID, ?Name, ?levelname, ?objectType, ?posx, ?posy, ?posz, ?tranx, ?trany, ?tranz)"; if (con.State.ToString()!="Open") con.Open(); using (con) { foreach (data itm in _GameItems) { using (cmd = new MySqlCommand(query, con)) { MySqlParameter oParam = cmd.Parameters.Add("?ID", MySqlDbType.VarChar); oParam.Value = itm.ID; MySqlParameter oParam1 = cmd.Parameters.Add("?Name", MySqlDbType.VarChar); oParam1.Value = itm.Name; MySqlParameter oParam2 = cmd.Parameters.Add("?levelname", MySqlDbType.VarChar); oParam2.Value = itm.levelname; MySqlParameter oParam3 = cmd.Parameters.Add("?objectType", MySqlDbType.VarChar); oParam3.Value = itm.objectType; MySqlParameter oParam4 = cmd.Parameters.Add("?posx", MySqlDbType.Float); oParam4.Value = itm.posx; MySqlParameter oParam5 = cmd.Parameters.Add("?posy", MySqlDbType.Float); oParam5.Value = itm.posy; MySqlParameter oParam6 = cmd.Parameters.Add("?posz", MySqlDbType.Float); oParam6.Value = itm.posz; MySqlParameter oParam7 = cmd.Parameters.Add("?tranx", MySqlDbType.Float); oParam7.Value = itm.tranx; MySqlParameter oParam8 = cmd.Parameters.Add("?trany", MySqlDbType.Float); oParam8.Value = itm.trany; MySqlParameter oParam9 = cmd.Parameters.Add("?tranz", MySqlDbType.Float); oParam9.Value = itm.tranz; cmd.ExecuteNonQuery(); } } } } catch (IOException ex) { Debug.Log(ex.ToString()); } finally {} } //      void UpdateEntries() { prepData(); string query = string.Empty; //   try { query = "UPDATE demo_table SET ID=?ID, Name=?Name, levelname=?levelname, objectType=?objectType, posx=?posx, posy=?posy, posz=?posz, tranx=?tranx, trany=?trany, tranz=?tranz WHERE iddemo_table=?UID"; if (con.State.ToString()!="Open") con.Open(); using (con) { foreach (data itm in _GameItems) { using (cmd = new MySqlCommand(query, con)) { MySqlParameter oParam = cmd.Parameters.Add("?ID", MySqlDbType.VarChar); oParam.Value = itm.ID; MySqlParameter oParam1 = cmd.Parameters.Add("?Name", MySqlDbType.VarChar); oParam1.Value = itm.Name; MySqlParameter oParam2 = cmd.Parameters.Add("?levelname", MySqlDbType.VarChar); oParam2.Value = itm.levelname; MySqlParameter oParam3 = cmd.Parameters.Add("?objectType", MySqlDbType.VarChar); oParam3.Value = itm.objectType; MySqlParameter oParam4 = cmd.Parameters.Add("?posx", MySqlDbType.Float); oParam4.Value = itm.posx; MySqlParameter oParam5 = cmd.Parameters.Add("?posy", MySqlDbType.Float); oParam5.Value = itm.posy; MySqlParameter oParam6 = cmd.Parameters.Add("?posz", MySqlDbType.Float); oParam6.Value = itm.posz; MySqlParameter oParam7 = cmd.Parameters.Add("?tranx", MySqlDbType.Float); oParam7.Value = itm.tranx; MySqlParameter oParam8 = cmd.Parameters.Add("?trany", MySqlDbType.Float); oParam8.Value = itm.trany; MySqlParameter oParam9 = cmd.Parameters.Add("?tranz", MySqlDbType.Float); oParam9.Value = itm.tranz; cmd.ExecuteNonQuery(); } } } } catch (IOException ex) {Debug.Log(ex.ToString());} finally {} } //     void DeleteEntries() { string query = string.Empty; //   try { //      ID ,    //----------------------------------------------------------------------- // query = "DELETE FROM demo_table WHERE iddemo_table=?UID"; // MySqlParameter oParam = cmd.Parameters.Add("?UID", MySqlDbType.Int32); // oParam.Value = 0; //----------------------------------------------------------------------- query = "DELETE FROM demo_table WHERE iddemo_table"; if (con.State.ToString()!="Open") con.Open(); using (con) { using (cmd = new MySqlCommand(query, con)) { cmd.ExecuteNonQuery(); } } } catch (IOException ex) {Debug.Log(ex.ToString());} finally {} } //      void ReadEntries() { string query = string.Empty; if (_GameItems == null) _GameItems = new List<data>(); if (_GameItems.Count > 0) _GameItems.Clear(); //   try { query = "SELECT * FROM view_demo"; if (con.State.ToString()!="Open") con.Open(); using (con) { using (cmd = new MySqlCommand(query, con)) { rdr = cmd.ExecuteReader(); if(rdr.HasRows) while (rdr.Read()) { data itm = new data(); itm.UID = int.Parse(rdr["iddemo_table"].ToString()); itm.ID = rdr["ID"].ToString(); itm.levelname = rdr["levelname"].ToString(); itm.Name = rdr["Name"].ToString(); itm.objectType = rdr["objectType"].ToString(); itm.posx = float.Parse(rdr["posx"].ToString()); itm.posy = float.Parse(rdr["posy"].ToString()); itm.posz = float.Parse(rdr["posz"].ToString()); itm.tranx = float.Parse(rdr["tranx"].ToString()); itm.trany = float.Parse(rdr["trany"].ToString()); itm.tranz = float.Parse(rdr["tranz"].ToString()); _GameItems.Add(itm); } rdr.Dispose(); } } } catch (IOException ex) {Debug.Log(ex.ToString());} finally {} } ///          void LogGameItems() { if (_GameItems != null) { if (_GameItems.Count > 0) { foreach (data itm in _GameItems) { Debug.Log("UID: " + itm.UID); Debug.Log("ID: " + itm.ID); Debug.Log("levelname: " + itm.levelname); Debug.Log("Name: " + itm.Name); Debug.Log("objectType: " + itm.objectType); Debug.Log("posx: " + itm.posx); Debug.Log("posy: " + itm.posy); Debug.Log("posz: " + itm.posz); Debug.Log("tranx: " + itm.tranx); Debug.Log("trany: " + itm.trany); Debug.Log("tranz: " + itm.tranz); } } } } ///         void prepData() { bodies = GameObject.FindGameObjectsWithTag("Savable"); _GameItems = new List<data>(); data itm; foreach (GameObject body in bodies) { itm = new data(); itm.ID = body.name + "_" + body.GetInstanceID(); itm.Name = body.name; itm.levelname = Application.loadedLevelName; itm.objectType = body.name.Replace("(Clone)", ""); itm.posx = body.transform.position.x; itm.posy = body.transform.position.y; itm.posz = body.transform.position.z; itm.tranx = body.transform.rotation.x; itm.trany = body.transform.rotation.y; itm.tranz = body.transform.rotation.z; _GameItems.Add(itm); } Debug.Log("Items in collection: " + _GameItems.Count); } } ///        void loadData() { //       bodies = GameObject.FindGameObjectsWithTag("Savable"); DestroyObject(bodies); //      if (_GameItems != null) { if (_GameItems.Count > 0) { foreach (data itm in _GameItems) { if (itm.objectType="CUBE") {Instantiate(mCUBE, new Vector3(itm.posx, itm.posy , itm.posz),Quaternion.Euler(itm.tranx, itm.trany, itm.tranz));} else if (itm.objectType="SPHERE") {Instantiate(mSPHERE, new Vector3(itm.posx, itm.posy , itm.posz),Quaternion.Euler(itm.tranx, itm.trany, itm.tranz));} else if (itm.objectType="TRIANGLE") {Instantiate(mTRIANGLE, new Vector3(itm.posx, itm.posy , itm.posz),Quaternion.Euler(itm.tranx, itm.trany, itm.tranz));} } } } } } 

Source: https://habr.com/ru/post/In185594/


All Articles