前回はShopオブジェクトの作成と、羊パラメータの増産をして、一通り遊べる状態にできました。
前回の記事↓
今回はコイン取得演出の追加と、セーブ・ロードを追加して一通りの完成を目指します。
コイン取得演出の追加
今は売却ボタンを押すと即座に所持金に加算されています。
もちろんこれでも問題はないのですが、所持金の表示が一番上で視界に入りづらい事もあり、若干「増えている感」が薄いという欠点があります。
そのため、あくまでも演出ですが、「コインが所持金TEXTのところまで飛んでいき、金額が増える」ようにします(よく見るやつですね)
コインオブジェクトの作成
では Assets/Images フォルダ内の coin をSceneにドラッグアンドドロップして、coinオブジェクトを作成してください。
作成されたcoinオブジェクトにはCoinスクリプトを新規で追加します。
Coinオブジェクトは
- WalletTextの所へ飛んでいく(できれば最初速く、後半遅く)
- WalletTextまで到着したら、所持金に金額を加算
としたいので、まずメンバ変数として
- 加算する金額
- Walletオブジェクト
を宣言しておきます。(これらは、後ほどWoolスクリプトからセットするように修正します。)
1 2 3 4 5 |
//加算する金額 public int value; //Walletオブジェクト 目的地兼、加算対象 public Wallet wallet; |
次にUpdateメソッドの中をこのように修正します。
1 2 3 4 5 6 7 8 9 10 11 12 |
void Update() { var v = wallet.transform.position - transform.position;//現在の位置から、Walletオブジェクトまで進むベクトル transform.position += v * Time.deltaTime * 20; //近づいたら到着したとみなす if (v.magnitude < 0.5f) { wallet.money += value; Destroy(gameObject); } } |
コメントにも書いてありますが、ベクトルを求めていますね。
ベクトルの計算については
でも少し触れていますが、ある地点(From)から、ある地点(To)へ移動するベクトルを求めるには、
var v = To – From;
と2つのベクトルの引き算をしてあげればよいので
var v = wallet.transform.position - transform.position;
と、ローカル変数v
に今の場所からWalletオブジェクトへ移動するベクトルv
を求めています。
これを、直接 transform.position += v;
とすると、coinオブジェクトの位置はWalletオブジェクトまで一瞬にして移動してしまいます。
そこで、Time.deltaTime
を使います。 Time.deltaTime
には「前回フレームから今回フレームまでの秒数」が入っているので、
transform.position += v * Time.deltaTime;
とすることで、「1秒間で目的地(Walletオブジェクト)にたどり着く速度で移動」という意味になります。
ただ、それだと遅すぎるのと、毎フレームローカル変数vが再計算されるので、目的地に近づくにつれて移動ベクトルvが短くなってしまい、1秒経っても辿り着かないほどの速度になってしまいます。
そのため、ある程度の速度までかさ上げをしてあげるため、適当な数値(今回は20倍にしました)をかけてあげたので
transform.position += v * Time.deltaTime * 20;
となっています。
こうして移動した後、ある程度まで近づいたら所持金を増やしたいので
v.magnitude
でベクトルの長さ=このcoinオブジェクトからWalletオブジェクトまでの距離を求めています。 ある程度より小さくなったら到着したとしたいので if文で0.5fより小さいかどうかで判断しています。( if(v.magnitude < 0.5f)
)
到着していたら所持金を増やし( wallet.money += money;
)
自分自身を削除しています。( Destroy(gameObject);
)
ではスクリプトは保存し、UnityEditor上で、coinオブジェクトをAssets/Prefabs にドラッグアンドドロップしてプレファブ化し、Scene上のcoinオブジェクトは消してしまいます。
Woolスクリプト修正
次にWoolスクリプトを修正します。今のWoolスクリプトはこのようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Wool : MonoBehaviour { [SerializeField] private Rigidbody2D _rigidbody2D; [SerializeField] private SpriteRenderer woolSpriteRenderer; //羊毛の色 public Color woolColor; //羊毛の売却価格 public int price = 100; //羊毛の売却処理 public void Sell(Wallet wallet) { wallet.money += price; Destroy(gameObject); } // Start is called before the first frame update void Start() { _rigidbody2D.AddForce(Quaternion.Euler(0, 0, Random.Range(-15, 15)) * Vector2.up * 4, ForceMode2D.Impulse); transform.localScale = Vector3.one * Random.Range(0.4f, 1.5f); woolColor.a = 0.9f;//ちょっと半透明に woolSpriteRenderer.color = woolColor; } // Update is called once per frame void Update() { if (transform.position.y < -5) { Destroy(gameObject); } } } |
22行目で売却処理が呼ばれたら直接walletのmoneyを増やしていますが、この箇所をcoinオブジェクトを作るように修正をしたいです。
そのために、まずcoinプレファブをInspectorでセット出来るようにメンバ変数を用意します。
1 2 |
[SerializeField] private Coin coinPrefab; |
次に、売却処理 Sellメソッドも以下のように修正します。
1 2 3 4 5 6 7 8 |
//羊毛の売却処理 public void Sell(Wallet wallet) { var coin = Instantiate(coinPrefab, transform.position, transform.rotation); coin.value = price; coin.wallet = wallet; Destroy(gameObject); } |
coinプレファブを複製(Instantiate)してローカル変数 coin
に格納し、金額(value
)と所持金オブジェクト(wallet
)をそれぞれセットするようにしてあげています。
なおInstantiate
メソッドに transform.position
と transform.rotateion
を渡すことで、woolの位置、回転状態でcoinオブジェクトを作るようにしています。
修正したWoolスクリプト全体はこのようになります。
おさらいと次回予告
今回はコイン取得演出を追加しました。
ここまででゲームのメインシステムは出来上がりです。
が、まだインフレ系クリッカーゲームに必須のセーブ・ロードシステムができていません。
次回はセーブ・ロードシステムやインターフェース機能を用いたデバッグシステムの実装を行います。
コメント