今回から、現金での売買を実装します。
画面設計
● ボタンは「仕入」と「売上」の2つだけ
●「仕入」で商品を1個仕入れます(@1000)
●「売上」で商品を1個売ります(@1500、利益500)
● 最初の手持ち現金(資本)は10000
Hierarchy
2つのボタン(ButtonPurchased、ButtonSaled)を追加して、Emptyオブジェクト(JournalButtons)でひとくくりにしています。JournalButtonsにはHorizontalLayoutGroupを設定しています。
ボタンを押した結果を表示するテキスト領域(JournalLog)はTextMeshProで作っています。
この2つのボタンとテキスト領域をEmptyオブジェクト(ImputWindow2)でひとくくりにして、VerticalLayoutGroupを設定しています。
今回も手抜きして、InputWindow2に、全部のオブジェクトをまとめたコードを付けます。
コード
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; public class InputWindow2 : MonoBehaviour { enum BUTTON_NAME { BUTTON_PURCHASED = 0, BUTTON_SALED }; [SerializeField] BalanceSheet bs; [SerializeField] GameObject journalButtons; [SerializeField] TextMeshProUGUI log; // 試算表 struct TrialBalance { public int cash; // 現金 public int purchase; // 仕入(費用) public int sales; // 売上(収益) public int pl; // 損益 public int q_remain; // 在庫残 public int q_total; // 在庫総購入量 } TrialBalance tb = new TrialBalance(); // 資本 int firstCash = 10000; // 販売物の仕入単価(現在は固定) int unitPrice = 1000; // 販売物の売価(現在は固定) int unitSales = 1500; string[] msg = new string[]{ "成功!", "現金不足!", "在庫不足!", "START!" }; void UpdateLog(int error) { if( !ReferenceEquals(log, null) ){ //現金:xxxx/仕入:xxxx/売上:xxxx/在庫:xx/xx(@100) log.text = msg[error] + "\n現金:" + tb.cash + "\n仕入:" + tb.purchase + "\n売上:" + tb.sales + "\n在庫:" + tb.q_remain + "/" + tb.q_total + "(@1000)"; } } void InitializeJournal() { tb.cash = firstCash; tb.purchase = 0; tb.sales = 0; tb.pl = 0; tb.q_remain = 0; tb.q_total = 0; UpdateLog( 3 ); } void ExecutePurchase() { int e = 0; if( tb.cash >= unitPrice ){ tb.cash -= unitPrice; tb.purchase += unitPrice; tb.q_remain++; tb.q_total++; tb.pl -= unitPrice; } else { e = 1; } UpdateLog( e ); } void ExecuteSale() { int e = 0; if( tb.q_remain > 0 ){ tb.cash += unitSales; tb.sales += unitSales; tb.q_remain--; tb.pl -= unitSales; } else { e = 2; } UpdateLog( e ); } void ButtonClicked(int buttonNo) { switch( buttonNo ){ case (int)BUTTON_NAME.BUTTON_PURCHASED: Debug.Log("Button Clicked = " + buttonNo + "Purchased!"); // OK ExecutePurchase(); break; case (int)BUTTON_NAME.BUTTON_SALED: Debug.Log("Button Clicked = " + buttonNo + "Saled!"); // OK ExecuteSale(); break; } } // Start is called before the first frame update void Start() { int i = 0; Button button; if( !ReferenceEquals(journalButtons, null) ){ foreach( Transform child in journalButtons.transform ){ button = child.gameObject.GetComponent<Button>(); if( !ReferenceEquals(button, null) ){ int ii = i; button.onClick.AddListener(() => ButtonClicked(ii)); i++; } } } InitializeJournal(); } }
表示テスト
少し雰囲気を出すため、背景を付けました。以下サイトの背景を使わせていただいています。
【フリー背景素材】背景制作会社 | アニメ背景美術会社CreativeFreaks
ゲームのURL(前回までと同じURLです)
tomo-mana.hatenablog.com
参考
今回作成しようとしている三分法による仕訳、決算処理、仕入価格の計算について、ざっくり以下の記事にまとめています。
Unity×簿記#1 売上の仕訳(分記法と三分法) - ゲーム化!tomo-manaのブログ
Unity×簿記#2 三分法における決算仕訳 - ゲーム化!tomo-manaのブログ
Unity×簿記#3 単価計算(仕入価格の変動による) - ゲーム化!tomo-manaのブログ
次回
貸借対処表を追加します。