tag:crieit.net,2005:https://crieit.net/tags/Unity%E7%B7%B4%E7%BF%92/feed 「Unity練習」の記事 - Crieit Crieitでタグ「Unity練習」に投稿された最近の記事 2023-03-15T23:42:14+09:00 https://crieit.net/tags/Unity%E7%B7%B4%E7%BF%92/feed tag:crieit.net,2005:PublicArticle/18405 2023-03-11T21:18:58+09:00 2023-03-15T23:42:14+09:00 https://crieit.net/posts/Unity-640c71b2ace84 Unity練習 セーブデータを作ろうぜ(^~^)? <h1 id="セーブデータの作り方調べ"><a href="#%E3%82%BB%E3%83%BC%E3%83%96%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%E8%AA%BF%E3%81%B9">セーブデータの作り方調べ</a></h1> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/kazuki_kuriyama/items/20847a040d5f52835ba6">Unityでセーブデータを作る方法まとめ</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 Unity でセーブデータを作る方法を調べようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 JSONファイルでいいんじゃないか?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Unity にファイルチューザーが あんの?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.unity3d.com/ja/current/ScriptReference/JsonUtility.html">JsonUtility</a><br /> 📖 <a target="_blank" rel="nofollow noopener" href="https://docs.unity3d.com/ja/current/ScriptReference/EditorJsonUtility.ToJson.html">EditorJsonUtility.ToJson</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ユーティリティーが2種類あるらしい。使ってみようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 サンプルが無くて 分からんな」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://logicalbeat.jp/blog/8195/">【Unity】JsonUtilityを触ってみた</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 セーブファイルを 100個ぐらい分けたいとき どうするんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 1つのJSONファイルに すべて詰め込むんじゃないか?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 容量は 何バイトまで 保存できるんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 移植先にもよるんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Webブラウザーの上で実行するアプリだったら、どこへ保存される?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 それも含めて調査しろだぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://blog.unity.com/ja/technology/persistent-data-how-to-save-your-game-states-and-settings">永続データ ― ゲームの状態と設定を保存する方法</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 保存先の設定をプログラムしないといけないらしいぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://github.com/UnityTechnologies/UniteNow20-Persistent-Data">UnityTechnologies/UniteNow20-Persistent-Data</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 サンプル・プログラムは これらしいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ソース読んだが 使い方 分からん。<br /> どうやって クロス・プラットフォーム のセーブデータを作れる?<br /> Windows を想定して ファイルパス書いていいのか?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://magnaga.com/2016/04/25/unity-save2/">PlayerPrefsと同様な使い勝手で独自クラスもセーブできる機能実装【Unity】【セーブ】【Json】</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 これを真似てみるかだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 なんだこのクラスは。真似たくない書き方だな」</p> <h1 id="セーブボタンを置こう"><a href="#%E3%82%BB%E3%83%BC%E3%83%96%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E7%BD%AE%E3%81%93%E3%81%86">セーブボタンを置こう</a></h1> <p><a href="https://crieit.now.sh/upload_images/e4257f7c7fa838934b0e7872bd1e8a03640c7bc3cdad4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e4257f7c7fa838934b0e7872bd1e8a03640c7bc3cdad4.png?mw=700" alt="202303_unity_11-2200--saveDataManager-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 とりあえず マネージャー・クラスを作る 鉄板のやり方で サンプルを書き直そう」</p> <p><a href="https://crieit.now.sh/upload_images/9a772f1c008ffd1d8cd102bbfca6878e640c7e2c2fd3c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9a772f1c008ffd1d8cd102bbfca6878e640c7e2c2fd3c.png?mw=700" alt="202303_unity_11-2211--onSave-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>OnSave</code> という Publicメソッドを作って」</p> <p><a href="https://crieit.now.sh/upload_images/ea6bc8e52d8e3c6380c649d8dd603506640c7fc19b479.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ea6bc8e52d8e3c6380c649d8dd603506640c7fc19b479.png?mw=700" alt="202303_unity_11-2211--saveButton-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Save</code> ボタンをクリックしたら、 <code>SaveDataManager</code> クラスの <code>OnSave</code> メソッドを呼び出すところまで<br /> 作るのは 鉄板だぜ」</p> <h1 id="マウスで動かせるオブジェクトを置こう"><a href="#%E3%83%9E%E3%82%A6%E3%82%B9%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%9B%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E7%BD%AE%E3%81%93%E3%81%86">マウスで動かせるオブジェクトを置こう</a></h1> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://futabazemi.net/notes/unity-mouse_drag">オブジェクトを掴んで動かす</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 上のリンク先の、他人の記事を読めだぜ。<br /> マウスで動かせるオブジェクトを画面上に置こうぜ?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://hakase0274.hatenablog.com/entry/2019/11/12/200000">Unity マウスからRayを打つ ~可視化もするよ~</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 別の記事も読まないと コードがおかしいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/00e9629b65a49f0d5deaa5b759b87a80640c9156da8e5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/00e9629b65a49f0d5deaa5b759b87a80640c9156da8e5.png?mw=700" alt="202303_unity_11-2333--inputManager-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/2830c4ae2e78f66fa1074ea64efa4156640c905f83bd0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2830c4ae2e78f66fa1074ea64efa4156640c905f83bd0.png?mw=700" alt="202303_unity_11-2326--script.png" /></a></p> <pre><code class="csharp">using System.Collections; using System.Collections.Generic; using UnityEngine; public class InputManager : MonoBehaviour { /// <summary> /// レイを描く距離 /// </summary> float DebugDrawRayDistance = 15.0f; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { // マウス右ボタン 押しっぱなし時 if (Input.GetMouseButton(0)) { // レイ(見えない光線のようなもの)を飛ばす var ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out var hit)) { // レイが当たったオブジェクト string goName = hit.collider.gameObject.name; Debug.Log("右クリック:" + goName); // そのオブジェクトの中心位置を、クリックした場所へ移動(カクカクした動き) GameObject.Find(goName).transform.position = new Vector3(hit.point.x, hit.point.y, 0); } else { Debug.Log("右クリック 外れ"); } // レイを描く Debug.DrawRay(ray.origin, ray.direction * DebugDrawRayDistance, Color.green, 5, false); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 カクカクしてるが、とりあえず これで 箱は動くぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <code>Update()</code> じゃなくて、 <code>LateUpdate()</code> にすりゃいいんじゃないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 うまくやってくれだぜ」</p> <h1 id="まず、 PlayerPrefs を練習しようぜ?"><a href="#%E3%81%BE%E3%81%9A%E3%80%81+PlayerPrefs+%E3%82%92%E7%B7%B4%E7%BF%92%E3%81%97%E3%82%88%E3%81%86%E3%81%9C%EF%BC%9F">まず、 PlayerPrefs を練習しようぜ?</a></h1> <p><a href="https://crieit.now.sh/upload_images/33f01c48d2ec58268bc1932413f76681640c98527113f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/33f01c48d2ec58268bc1932413f76681640c98527113f.png?mw=700" alt="202303_unity_12-0002--loadButton-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 セーブボタンだけあっても練習できない。ロードボタンも追加するぜ」</p> <p><code>SaveDataManager.cs</code> :</p> <pre><code class="csharp">using System.Collections; using System.Collections.Generic; using UnityEngine; public class SaveDataManager : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } // - イベントハンドラ public void OnSave() { Debug.Log("セーブします"); var goCube = GameObject.Find("Cube"); PlayerPrefs.SetFloat("x", goCube.transform.position.x); PlayerPrefs.SetFloat("y", goCube.transform.position.y); PlayerPrefs.SetFloat("z", goCube.transform.position.z); } public void OnLoad() { Debug.Log("ロードします"); var goCube = GameObject.Find("Cube"); var x = PlayerPrefs.GetFloat("x"); var y = PlayerPrefs.GetFloat("y"); var z = PlayerPrefs.GetFloat("z"); goCube.transform.position = new Vector3(x, y, z); } } </code></pre> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1634576987200294912?s=20">開発中画面</a></p> <p>📅 2023-03-12 sun 00:29</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 これで 思ってるように セーブとロードは でけた」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 バカでかい容量のセーブをしたいとき こんなシンプルな構造で 対応しきれるのかだぜ?<br /> クラスを シリアライズ/デシリアライズ して 投げ込めないの?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <code>String</code> 型のセッターに JSON を投げ込めだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 そんなこと していいのかな……」</p> <h1 id="まず、セーブ・スロットを3つにしようぜ?"><a href="#%E3%81%BE%E3%81%9A%E3%80%81%E3%82%BB%E3%83%BC%E3%83%96%E3%83%BB%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88%E3%82%92%EF%BC%93%E3%81%A4%E3%81%AB%E3%81%97%E3%82%88%E3%81%86%E3%81%9C%EF%BC%9F">まず、セーブ・スロットを3つにしようぜ?</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 セーブ・ファイルって 複数個 持ちたいよな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 自分用、弟用、クリアー・データ用よね」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://xr-hub.com/archives/12118">【Unity uGUI】ドロップダウン(Dropdown)を使用してオプションを選択する方法</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 とりあえず ドロップダウン の作り方を調べるか」</p> <p><a href="https://crieit.now.sh/upload_images/6619beb770fc600aaac4306532da6a40640d48ef7f139.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6619beb770fc600aaac4306532da6a40640d48ef7f139.png?mw=700" alt="202303_unity_12-1235--dropdown-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 さて、何を どうすればいいのか?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 UI は、スクリプトから 操作したいよな」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.ame-name.com/archives/12633">【Unity】ドロップダウンの表示テキストを変える</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 何かをやろうとしても、はて、と分からんことばっかりで つらい。調べる」</p> <p><a href="https://crieit.now.sh/upload_images/703c29c8ddd6fae41458a81f8cf5c3f5640d6d9f90a70.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/703c29c8ddd6fae41458a81f8cf5c3f5640d6d9f90a70.png?mw=700" alt="202303_unity_12-1513--saveSlot.png" /></a></p> <p>📅 2023-03-12 sun 15:14</p> <p><code>SaveDataManager.cs</code> :</p> <pre><code class="csharp">using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class SaveDataManager : MonoBehaviour { TMP_Dropdown dropdown; // Start is called before the first frame update void Start() { dropdown = GameObject.Find("Save Slot Dropdown").GetComponent<TMP_Dropdown>(); // ドロップダウンリストのラベル dropdown.options[0].text = "Save Data 1"; dropdown.options[1].text = "Save Data 2"; dropdown.options[2].text = "Save Data 3"; // コンボボックスのラベル // // - 最初に選択されている項目に合わせないと挙動がおかしくなる dropdown.captionText.text = dropdown.options[0].text; } // Update is called once per frame void Update() { } // - フィールド string[] gameObjectNamesToSave = new string[] { "Red Cube", "Green Cube", "Blue Cube", }; // - イベントハンドラ public void OnSave() { Debug.Log($"{(dropdown.value)}+1番へ、セーブしたい"); foreach (var gameObjectName in gameObjectNamesToSave) { var gameObject = GameObject.Find(gameObjectName); // ゲームオブジェクトの名前には、いろんな文字が使えるので、区切りなるような文字がない。とりあえずドット区切りにする var nameSpace = $"Slot{dropdown.value}.{gameObjectName}"; PlayerPrefs.SetFloat($"{nameSpace}.x", gameObject.transform.position.x); PlayerPrefs.SetFloat($"{nameSpace}.y", gameObject.transform.position.y); PlayerPrefs.SetFloat($"{nameSpace}.z", gameObject.transform.position.z); } } public void OnLoad() { Debug.Log($"{(dropdown.value)}+1番から、ロードしたい"); foreach (var gameObjectName in gameObjectNamesToSave) { var gameObject = GameObject.Find(gameObjectName); // ゲームオブジェクトの名前には、いろんな文字が使えるので、区切りなるような文字がない。とりあえずドット区切りにする var nameSpace = $"Slot{dropdown.value}.{gameObjectName}"; gameObject.transform.position = new Vector3( PlayerPrefs.GetFloat($"{nameSpace}.x"), PlayerPrefs.GetFloat($"{nameSpace}.y"), PlayerPrefs.GetFloat($"{nameSpace}.z")); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし、ドロップ・ダウン・リストの使い方を覚えたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 やったぜ!」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 やったわね!」</p> <h1 id="📅 2023-03-15 wed 19:18"><a href="#%F0%9F%93%85+2023-03-15+wed+19%3A18">📅 2023-03-15 wed 19:18</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 次は、XML 形式で保存できるように改造しようぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://nekosuko.jp/1893/">【Unity】JsonUtilityを使ったJson化</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 分からんことがいっぱいなので調べるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 よし、簡単なとこだけ つかんだので そこだけやろ」</p> <p><a href="https://crieit.now.sh/upload_images/f7576d2ceeffbae78410f7f6a56d7fc06411a7a2c30ee.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f7576d2ceeffbae78410f7f6a56d7fc06411a7a2c30ee.png?mw=700" alt="202303_unity_15-2009--tree.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 階層構造はこうなるぜ。<br /> 関係あるところを見ていこう」</p> <p><a href="https://crieit.now.sh/upload_images/3d89644f2ed4362581661d90cc031bbd6411a81bdde58.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3d89644f2ed4362581661d90cc031bbd6411a81bdde58.png?mw=700" alt="202303_unity_15-2012--gameObject.png" /></a></p> <p><code>Assets.Scripts.Models.SaveData.GameObject.cs</code>:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.SaveData { using UnityEngine; /// <summary> /// UnityのGameObjectをラッピング /// </summary> [System.Serializable] public class GameObject { // -^ その他 /// <summary> /// 生成 /// </summary> /// <param name="gameObject"></param> /// <returns></returns> internal static GameObject FromGameObject(UnityEngine.GameObject gameObject) { return new GameObject { name = gameObject.name, x = gameObject.transform.position.x, y = gameObject.transform.position.y, z = gameObject.transform.position.z }; } // - フィールド public string name; public float x; public float y; public float z; // - メソッド internal Vector3 ToPosition() { return new Vector3(this.x, this.y, this.z); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>GameObject</code> と同名で、保存したいところだけ作ったクラスを用意するぜ。<br /> クラス名の上の行に <code>[System.Serializable]</code> が付いているのを忘れるなだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/3a9a03cb8ea9ff6f5feadab6e7a90cfb6411a8dbcb934.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3a9a03cb8ea9ff6f5feadab6e7a90cfb6411a8dbcb934.png?mw=700" alt="202303_unity_15-2015--init.png" /></a></p> <p><code>Assets.Scripts.Models.SaveData.Init.cs</code>:</p> <pre><code class="csharp">namespace Assets.Scripts.Models.SaveData { using System.Collections.Generic; using ModelOfSaveData = Assets.Scripts.Models.SaveData; /// <summary> /// セーブ・データ /// </summary> public class Init { // - その他 internal Init() { this.gameObjects = new List<ModelOfSaveData.GameObject>(); } // - フィールド // JsonUtilクラスは、Dictionary型には対応していない public List<ModelOfSaveData.GameObject> gameObjects; // - メソッド /// <summary> /// ゲームオブジェクトの追加 /// </summary> /// <param name="item"></param> public void AddGameObject(ModelOfSaveData.GameObject item) { this.gameObjects.Add(item); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>SaveData.Init</code> クラスが、セーブデータ・クラス階層構造のトップ・レベルのクラスだぜ。<br /> セーブスロット1個分のデータが全部入ってると思えだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/808bfacf3c7c040f3a39d15bd0525bf86411acdf6c81e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/808bfacf3c7c040f3a39d15bd0525bf86411acdf6c81e.png?mw=700" alt="202303_unity_15-2032--saveDataManager.png" /></a></p> <p><code>Assets.Scripts.SaveDataManager.cs</code>:</p> <pre><code class="csharp">using TMPro; using UnityEngine; using ModelOfSaveData = Assets.Scripts.Models.SaveData; public class SaveDataManager : MonoBehaviour { TMP_Dropdown dropdown; // Start is called before the first frame update void Start() { dropdown = GameObject.Find("Save Slot Dropdown").GetComponent<TMP_Dropdown>(); // ドロップダウンリストのラベル dropdown.options[0].text = "Save Data 1"; dropdown.options[1].text = "Save Data 2"; dropdown.options[2].text = "Save Data 3"; // コンボボックスのラベル // // - 最初に選択されている項目に合わせないと挙動がおかしくなる dropdown.captionText.text = dropdown.options[0].text; } // Update is called once per frame void Update() { } // - フィールド string[] gameObjectNamesToSave = new string[] { "Red Cube", "Green Cube", "Blue Cube", }; // - イベントハンドラ public void OnSave() { // セーブデータ・モデルの作成 var saveDataModel = new ModelOfSaveData.Init(); // 記憶したいゲームオブジェクトを格納 foreach (var gameObjectName in gameObjectNamesToSave) { var gameObject = GameObject.Find(gameObjectName); var gameObject2 = ModelOfSaveData.GameObject.FromGameObject(gameObject); saveDataModel.AddGameObject(gameObject2); } // JSON文字列化(シリアライズ) var jsonText = JsonUtility.ToJson(saveDataModel); // 保存 Debug.Log($"{(dropdown.value)}+1番へ、セーブしたい。 Json:{jsonText}"); PlayerPrefs.SetString($"Slot{dropdown.value}", jsonText); } public void OnLoad() { // 読取(JSONテキスト取得) var jsonText = PlayerPrefs.GetString($"Slot{dropdown.value}"); Debug.Log($"{(dropdown.value)}+1番から、ロードしたい。 Json:{jsonText}"); // セーブデータ・モデルへ復元 var saveDataModel2 = JsonUtility.FromJson<ModelOfSaveData.Init>(jsonText); if (saveDataModel2==null) { // 復元できません Debug.Log($"{(dropdown.value)}+1番 ロードできませんでした。 Json:{jsonText}"); return; } // 記憶されているゲームオブジェクトを取出し foreach (var gameObject2 in saveDataModel2.gameObjects) { var gameObject = GameObject.Find(gameObject2.name); gameObject.transform.position = gameObject2.ToPosition(); } } } </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 セーブデータを読み書きするクラスだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 これで ゲームをセーブできるな」</p> <h2 id="WebGL"><a href="#WebGL">WebGL</a></h2> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 WebGL 形式で出力して、ブラウザで動かしても セーブ/ロード できんの?」</p> <p><a href="https://crieit.now.sh/upload_images/2fe31c2e365587ab82c25629e47267996411c119e67fb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2fe31c2e365587ab82c25629e47267996411c119e67fb.png?mw=700" alt="202303_unity_15-2158--webGL.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よっしゃ、実験してみるかだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/6cc90dea46920ae4e274d4d3be6a5e5c6411c1c29798f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6cc90dea46920ae4e274d4d3be6a5e5c6411c1c29798f.png?mw=700" alt="202303_unity_15-2201--saveLoad.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 できたり、できなかったりするな、ちょっと 調べるか」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 気になったのは、 <strong>デバッグ・ログ</strong> そのまんま出てくるのか 整えないと カッコ悪いな」</p> <p><a href="https://crieit.now.sh/upload_images/24becbe9afe4833b908b46a09f0145656411c9bace1fb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/24becbe9afe4833b908b46a09f0145656411c9bace1fb.png?mw=700" alt="202303_unity_15-2235--test.png" /></a></p> <p>📅 2023-03-15 wed 22:38</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし、動いていることもあるし 完成とするかだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 わらう」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Unity のサイトにアップロードしましょう!」</p> <h2 id="Unity Play"><a href="#Unity+Play">Unity Play</a></h2> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://play.unity.com/">Unity Play</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 アップロード後に ゲーム画面上の×ボタンを押して ブラウザの戻るボタンを押したら<br /> 画面が真っ白になった!」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 一度 間違った操作を行うと 続けて 間違った操作を行ってしまう。<br /> わらう」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 何もできん」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 今日は終わりかしらねえ」</p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://play.unity.com/mg/other/save-data-practice">Save Data Practice</a></p> <p>📅 2023-03-15 wed 23:41</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 1時間放置したら アクセスできるようになった。アップロードした。<br /> もう終わり!」</p> <p><おわり></p> むずでょ