こちらの記事を参考にしました。
対象の画像をアセットの中から選択し、スプライトモードを複数に設定。
スプライトエディターのボタンを押す。
スライスを選択し、今回は32×32ピクセルの画像が並んでいるので、この設定でスライス。
この状態で適用。
この分割されたパーツを配置すればOK。
このサイトを見て解決しました。
https://miyagame.net/canvas-size/
簡単に原因を説明すると、
Canvasのサイズがめちゃくちゃデカすぎておかしいことになってた。
これをスマホの解像度サイズ(カメラのサイズ)に合わせることで正しく表示されるようになります。
こちらでシングルトンの実装を行ったのですが、
これだけだとシーンの中では共有できるけど、
シーンが切り替わるとデータを共有出来ないっぽい。
なので、DontDestroyOnLoadを使いました。
DontDestroyOnLoadを使用すると、シーンが切り替わってもデータは保持されるらしい。
しかし、使い方を間違えると、DontDestroyOnLoadに同じデータが溜まっていくらしいけど、それはそのとき考える。
今のところ問題ないっぽい。
Unityでマスターデータを読み込ませるのに、前のプロジェクトで作成していたcsv、jsonを読み込ませます。
データはアセットの中に格納しておきます。
csvの場合は前のプロジェクトと全く同じ。
いろんなサンプルコード公開されているけど、なんでファイルストリームを扱うのにusingを使わないんだろう?
Jsonは元々UnityにはJsonUtilityという、それはそれは高速なJsonライブラリがあるのですが、
どうも気難しい性格みたいで、どんなに頑張っても作成済みのJsonファイルをオブジェクトに展開できない。
なので、結局、前と同じJson.Netを使用しました。
組み込み方法は、アセットストアにJson.Net for Unityのアセットが公開されているので、これをダウンロードする。
https://assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347?locale=ja-JP
ZIPファイルからdllをPluginsにコピーして~
とか、いろんなサイトに書いてありますが、そんな手順は不要です。
一度このアセットをダウンロードしてしまえば、前と同じコードでJsonを展開できます。
初めからこうすれば良かった。
農場経営ゲームのデータ構成はもう出来上がっているので、
これはこのままデータクラスとしてスクリプチオを作成。
特に基底クラスは指定していません。
で、これを複数のシーンからでも参照できるようにしたい。
参考にしたのはこちらでした。
シングルトンの基底クラスのコードはそのまま使えるはず。
このクラスを継承してゲームマネージャークラスを作成。
public class GameManager : SingletonMonoBehaviour<GameManager>
{
private PlayerData _playerData = null;
private MasterData _masterData = null;
private bool _initialized = false;
public bool Initialized
{
get
{
return _initialized;
}
}
public MasterData MasterData
{
get
{
return _masterData;
}
}
public PlayerData PlayerData
{
get
{
return _playerData;
}
}
これをコンポーネントとして適当に登録しておく。
登録しておかないと、
instance = (T)FindObjectOfType(typeof(T));
で、クラスが見つからないと怒られるので注意。
参照するときは
GameManager gameManager = GameManager.Instance;
で可能なはず。
まぁ、今回はスクリプトのデバッグ方法も分かったので、収穫は大きかった。
こちらの記事を参考にしました。
http://kuromikangames.com/article/475434825.html
いろいろ探してみたのですが、この外部パッケージを使うのが一番早いらしい。
https://github.com/naichilab/Unity-FadeManager
このパッケージをインポートして、プレハブをシーンに追加。
そして、シーン切り替え処理を置き換えます。
public void onTouchFarmScene()
{
FadeManager.Instance.LoadScene("FarmScene", 0.3f);
}
左上のデバッグ表示が気になるけど、後でなんとかする。
こちらのサイトを参考にしました。
シーン→UI→イベントシステムでシーンにイベントシステムを追加します。
これでシーンでタッチ操作が有効になります。
この操作はシーン毎に実行する必要あり。
やってみた感じでは、一つのスクリプトに複数書けるみたい。
イベントトリガーから「新しいイベントタイプを追加」で「PointerClick」を追加し、「+」をクリック、「なし(オブジェクト)」の所にアタッチしたスクリプトをドラッグし、「No Function」をクリックして、実行する関数を選択する。
タッチ判定を行う領域を設定します。
今回はボタンなので、ボックスコライダーを設置します。
これで、コライダーをタップするとスクリプトを実行する処理が完成します。
これらをボタンそれぞれ設定すれば実装完了。
Interpreterパターンのサンプルコードをまとめようと思ったのですが・・・
うまくまとまりませんでした。
Interpreterパターンは言語解析の用途に使用されます。
クラス図にするとこんな感じです。
https://www.techscore.com/tech/DesignPattern/Interpreter.html/
package org.example.interpreter;
public abstract class AbstractExpression {
public abstract void interpret(String context);
}
package org.example.interpreter;
import java.util.ArrayList;
public class NonTerminalExpression extends AbstractExpression{
@Override
public void interpret(String context) {
String[] contexts = context.split(",");
for(int i = 0; i < contexts.length; i++)
{
AbstractExpression child = new TerminalExpression();
child.interpret(contexts[i]);
}
}
}
package org.example.interpreter;
public class TerminalExpression extends AbstractExpression{
@Override
public void interpret(String context) {
}
}
package org.example.interpreter;
public class Main {
public static void main(String args[])
{
AbstractExpression child = new NonTerminalExpression();
child.interpret(args[0]);
}
}
言語を文節に分けるのはNonTerminalExpression、実際に解析を行うのはTerminalExpressionで処理を行います。
NonTerminalExpressionでは必要に応じて次のNonTerminalExpressionやTerminalExpressionをインスタンス化して使用されます。