アイテムの売却処理の作り方 クリックで生成したアイテム(羊毛)を換金する

Unity 放置インフレ系クリッカーゲームの作り方 (スマホ化対応)


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

前回は、羊から羊毛(wool)オブジェクトが出てくるようになりました。

前回の記事↓

クリック時のアイテム生成処理の作り方 (羊から羊毛を刈り取る処理)
前回は、画面配置と羊オブジェクトを作成しました。 前回の記事↓ 今回は羊から毛を刈り取った時に出る羊毛(Wool)の作成をやっていきます。 羊毛(wool)オブジェクトの作成 次に羊毛(wool)オブジェクトを作成していきます。...

今回はその刈り取った羊毛(Wool)の売却処理を実装していきます。

Walletの作成

まず手持ちのお金を管理・表示するオブジェクト用意しましょう。

お金が入っているのはWallet(財布)なので、Walletオブジェクトを作ります。

Hierarchyの第2回で作成したCanvas/Panel(Header) を選択し、UI→Text を追加します。

追加されたTextは以下のように設定しておきます。

  • 名前 Text(Wallet)
  • RectTransform
    • Anchor Min X:0 Y:0
    • Anchor Max X:1 Y:1
    • Left 0 Top 0 Right 0 Bottom 0
    • 上記設定はAnchorPresetsからShift+Altを押しながら右下のボタンをクリックでも良いです

  • Text
    • Font : ShigotoMatomegaki-Regular-1-01
    • Font Style:Bold
    • Font Size:48
    • Alignment: 中央寄せ(水平センタリング・垂直センタリング)
  • Wallet スクリプトを追加 (Add Component → New Scripts → Wallet)

 では、Walletスクリプトをそのまま修正していきます。

まず、using を2行追加しています。

using System.Numerics; は BigInteger (後述)を使用するために、 using UnityEngine.UI; は Text をスクリプトで使用するために宣言しています。

次に所持金を管理するために BigInteger money を宣言しています。

この BigInteger というのは int(Integer:整数)の桁数が多いバージョンです。 クリッカーゲームをやった事ある方はご存知かと思いますが、どんどんと所持金(クッキーなど)の増加量が増えてきてインフレしていくのが魅力の一つです。

そうなってくると、普通のintでの表現できる数(-2,147,483,648 から 2,147,483,647)を超えてしまう可能性があります。

では、longにすれば?というと、longでも表現できる数は-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 になります。

これでも足りない可能があるので、理論上上限が無い BigInteger を使う事にします(考えすぎかもしれませんが) 。

そして、

でInspectorから所持金を表示するためのTextをセット出来るようにしています。

この、walletTextに表示する所持金をセットしているのが Update関数の中にある

になります。

ここで、BigInteger型の変数 money を ToString メソッドで文字列に変換しているんですが、“C0”という引数が渡されています。 これは、書式指定というものになります。 

色々な指定があります(参考:https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-numeric-format-strings)。

よく使うのは D (Decimal:10進数)やN(Number:数値)ですが、今回はC(Currency:通貨)を使っています。 通貨を表すための書式指定なので

  • 勝手に \ や $ が付く
  • 桁区切りの「,」が入る

といった特徴があります。 Cの後ろの0 は小数点以下の数を指定しています。 0なので、小数点以下は無し。という意味です。  

usingについて using というのは 雑に言うと「苗字を省略するための構文」になります。 BigInteger は 本当は System.Numerics.BigInteger が正式なクラス名ですし、 TextUnityEngine.UI.Text が正式なクラス名です。

この「フルネーム」を毎回書くのが大変なので、先に苗字(System.NumericsUnityEngine.UI など)だけをusing で宣言しておいて、実際のプログラムでは末端の名前だけで済むようにしている。というわけです。
スクリプトを修正したら保存をして、UnityEditorに戻りましょう。
 
Text(Wallet) Inspectorで Walletスクリプトの Wallet Text が None (Text) という状態になっているので、自分自身のTextをドラッグしてセットしておきます。

では確認の為に再生してみましょう。

所持金は0円から増えていないので、「\0」と表示されています。

売却ボタンの作成

では、次に籠に溜まった羊毛(Wool)を売却できるように、売却ボタンを作りましょう。

先ほどのPanel(Header)にTextを追加したのと同様に、Canvas/Panel(Sell) を選択し、今度はUIボタンを追加します。

追加されたButtonは以下のように設定しておきます。

  • 名前 Button(Sell)
  • RectTransform
    • Anchor Min X:0 Y:0
    • Anchor Max X:1 Y:1
    • Left 0 Top 0 Right 0 Bottom 0
    • 上記設定はAnchorPresetsからShift+Altを押しながら右下のボタンをクリックでも良いです

  • Button(Sell)子要素のText
    • Text:売却
    • Font : ShigotoMatomegaki-Regular-1-01
    • Font Style:Bold
    • Font Size:48
    • Alignment: 中央寄せ(水平センタリング・垂直センタリング)

この時点で、実行画面は以下のようになるはずです。

もちろん、売却ボタンを押してもなにも起きません(何もスクリプトを書いてませんしね)

GameMainオブジェクトの作成

では、この売却ボタン(Button(Sell)) をクリックしたら、実際に籠に溜まった羊毛(Wool)を売却できるようにしていきます。 HierarchyでCTRL+SHIFT+Nを押し、新規オブジェクトを作成します。

  • 名前:GameMain
  • AddComponent → New script → GameMain でスクリプト追加

このGameMainスクリプトを作っていきます。

メンバ変数

まず、「売却ボタンを押したら」という処理を組みたいので、InspectorでButtonを受け取れるように 変数 sellButton を [SerializeField]で宣言しておきます。

次に、売却するということは、財布(Wallet)のお金(money)を増やすという事なので、同じくInspectorでWalletオブジェクトが受け取れるように、変数 wallet を [SerializeField]で宣言しておきます。

売却メソッド

売却用のメソッド SellAllWool() を用意します。

メソッド内ではまず FindOBjectsOfType<Wool>() で(コメントに書いてある通りではありますが)画面上のWoolスクリプトが付いているオブジェクトを全て探索して、woolsに格納しています。 それを foreach で全て回し、

  • walletのmoneyを(とりあえず)100増加
  • Destroy で削除

させています。

ボタンクリックイベントの追加

まだこのままでは、ボタンをクリックしてもSellAllWoolは呼ばれません。 Inspectorからクリック時に呼ぶメソッドを指定する方法もありますが、今回はスクリプト上でクリック時に呼ぶメソッドを指定する方法をとります。

1行ではありますが、細かく説明をすると

  • sellButton は、Inspectorでセットする予定の売却ボタンが格納されています。
  • そのsellButton の onClick.AddListener で、クリック時の処理について追加をしようとしています。
  • AddListener には 今回の場合はonClick=クリック時に、どの関数を呼ぶか指定する必要があるため先ほど用意した SellAllWoolメソッドを指定しています。

GameMainスクリプト全体は以下のようになります(using宣言を忘れずに)。

  ではスクリプトを忘れずに保存して、UnityEditor上でのInspectorでButtonオブジェクトとWalletオブジェクトをセットし、再生して確認をしてみましょう。

羊毛(Wool)の売却金額設定

今はGameMainスクリプトでは羊毛の売却金額を

として、一律100円に決め打ちして所持金に加算していますが、本来羊毛(Wool)の価値は羊毛自身が持っているべきなので、売却価格を表すメンバ変数 priceと、今後の事を考えてWoolスクリプトに売却処理を示すメソッド、Sell を追加しましょう。

Woolスクリプトを以下のように修正します。

priceはとりあえず100円にしてあります。

Sellメソッドでは 引数で受け取った Walletオブジェクトに金額を足しこんで、自分自身をDestroy(削除)するようにしました。

GameMainスクリプト修正

WoolスクリプトにWalletへ金額を足しこむ処理及び羊毛(Wool)の削除処理=Sellメソッドが入りましたので、GameMainスクリプトではそのメソッドを呼ぶだけになります。

忘れずに2つのスクリプト(WoolとGameMain)を保存したら、UnityEditorで挙動が変わらない事を確認しましょう。  

おさらいと次回予告

今回は羊毛オブジェクトの売却処理を作りました。

次回は、羊オブジェクトを作り込んでいきます。

次回の記事↓

羊オブジェクトの移動と生成処理 クリックアイテムを動かそう
前回は、売却ボタンの作成と、羊毛(Wool)の売却処理を実装しました。 前回の記事↓ 今回は羊オブジェクトの生成・移動処理をメインで作っていきます。 改めてクリッカーゲームのルール設定について さて、もう5回目となりちょっとずつ...

コメント

タイトルとURLをコピーしました