「技術」カテゴリーアーカイブ

【Unity】画像をクリッピングする。

こちらの記事を参考にしました。

https://miyagame.net/sprite/

対象の画像をアセットの中から選択し、スプライトモードを複数に設定。

スプライトエディターのボタンを押す。

スライスを選択し、今回は32×32ピクセルの画像が並んでいるので、この設定でスライス。

この状態で適用。

この分割されたパーツを配置すればOK。

【Unity】シーン間でもデータを共有させたい。

こちらでシングルトンの実装を行ったのですが、

これだけだとシーンの中では共有できるけど、

シーンが切り替わるとデータを共有出来ないっぽい。

なので、DontDestroyOnLoadを使いました。

DontDestroyOnLoadを使用すると、シーンが切り替わってもデータは保持されるらしい。

しかし、使い方を間違えると、DontDestroyOnLoadに同じデータが溜まっていくらしいけど、それはそのとき考える。

今のところ問題ないっぽい。

【Unity】Jsonでマスターデータを読み込ませる。

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を展開できます。

初めからこうすれば良かった。

【Unity】シングルトンでマスターデータを作成

農場経営ゲームのデータ構成はもう出来上がっているので、

これはこのままデータクラスとしてスクリプチオを作成。

特に基底クラスは指定していません。

で、これを複数のシーンからでも参照できるようにしたい。

参考にしたのはこちらでした。

シングルトンの基底クラスのコードはそのまま使えるはず。

このクラスを継承してゲームマネージャークラスを作成。

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;

で可能なはず。

まぁ、今回はスクリプトのデバッグ方法も分かったので、収穫は大きかった。

【Unity】フェードでシーン切り替え

こちらの記事を参考にしました。

http://kuromikangames.com/article/475434825.html

いろいろ探してみたのですが、この外部パッケージを使うのが一番早いらしい。

https://github.com/naichilab/Unity-FadeManager

このパッケージをインポートして、プレハブをシーンに追加。

そして、シーン切り替え処理を置き換えます。

    public void onTouchFarmScene()
    {
        FadeManager.Instance.LoadScene("FarmScene", 0.3f);
    }

左上のデバッグ表示が気になるけど、後でなんとかする。

【Unity】タッチ処理を実装する。

こちらのサイトを参考にしました。

イベントシステムの実装

シーン→UI→イベントシステムでシーンにイベントシステムを追加します。

メインカメラに物理2Dレイキャスターを追加

これでシーンでタッチ操作が有効になります。

この操作はシーン毎に実行する必要あり。

タッチ処理を記述したスクリプトを用意

やってみた感じでは、一つのスクリプトに複数書けるみたい。

パーツにスクリプトをアタッチ

イベントトリガーを追加

イベントトリガーから「新しいイベントタイプを追加」で「PointerClick」を追加し、「+」をクリック、「なし(オブジェクト)」の所にアタッチしたスクリプトをドラッグし、「No Function」をクリックして、実行する関数を選択する。

コライダーを登録

タッチ判定を行う領域を設定します。

今回はボタンなので、ボックスコライダーを設置します。

これで、コライダーをタップするとスクリプトを実行する処理が完成します。

これらをボタンそれぞれ設定すれば実装完了。

【Unity】シーンにパーツを配置する

画面にパーツを配置してみました。

画面サイズは一番小さい解像度に合わせています。

大きい解像度の端末では、端っこに空きスペースができますが、まぁ、小さい端末使用時に画面からはみ出すよりはマシでしょう。

位置合わせは直接数字をコピペしたほうがよいです。

ほかに早くて良い方法ある?

表示順序はレイヤーの順序を変えることで、どの絵を上に持ってくるかを設定できます。

【Unity】画面に画像を表示する。

プラットフォームやライブラリが変わってもゲーム作りの根本的な部分は一緒なんだなぁ、と、cocos-2dxやAltseedを使ってみてなんとなく気がつきました。

そのときはNodeとかSpriteとか言いましたが、Unityの場合はAssetと呼ばれているようです。

要は、Assetsの中に画像を格納し、それをシーンに張り付けば表示できるはず。

Androidでは横向きに表示させたいので、Player設定を変える必要があります。

できました。

【デザインパターン】Interpreterパターン

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をインスタンス化して使用されます。