tag:crieit.net,2005:https://crieit.net/magazines/muzudho1/Unity%E7%B7%B4%E7%BF%92/feed
[連載] Unity練習の投稿 - Crieit
Crieitで連載「[連載] Unity練習」の最近の投稿
2023-03-15T23:42:14+09:00
https://crieit.net/magazines/muzudho1/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>
むずでょ