Sat
Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 13 / 18.
Bir kuleyi satmak, yükseltmeler dâhil maliyetinin yarısını geri kazandırır; bu yüzden bir savunmayı taşımak bir miktar maliyetlidir, ama tamamı değil. Kule, kendisine harcanan paranın toplamını tutar: inşa edildiğindeki fiyatı ve ödenen her yükseltmenin fiyatı. Geri ödeme bu toplamın yarısıdır ve tam sayı bölmesi sonucu aşağı yuvarlar. Bisiklet kiralama da aynı türden bir toplam tutar:
public void ExtendRide(int extraHours)
{
paid += extraHours * pricePerHour;
}
public int Deposit => paid / 4;Satmak kuleyi yok eder ve pedin tower alanı hâlâ onu gösterir. Unity'nin == işleci, yok edilmiş bir nesneyi null olarak değerlendirir; bu nedenle sonraki kareden itibaren pad.tower == null doğrudur ve ek kod olmadan ped yeniden boşalır. Panel ise farklı bir konudur: satılan kuleyi göstermeye devam eder ve Upgrade'e tıklamak, yok edilmiş bir nesneye erişerek MissingReferenceException hatasına yol açar. Satış hiçbir şeyi seçmez ve bu da paneli gizler.
Görev
OrtaToweriçinde, özel bir int olanspentdeğerini tut:Startiçinde ayarlanan kulenincostdeğeri ve her yükseltme satın alındığında yükseltmenin fiyatı.public int SellValue => spent / 2;ekle.BuildManageriçinde, panel doldurulduğunda serileştirilmiş bir TMP_TextsellLabeliçinde seçili kulenin satış değerini,Sell 25olarak göster.- Satış düğmesinin çağırdığı
public void SellSelected()metodunu yaz: satış değerini GameManager üzerinden geri öde, kuleyi yok et ve hiçbir şey seçme.
Play'e bas, ardından birkaç kule inşa et, yükselt ve sat; sonra Check'e bas.
Kendin dene
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using TMPro;
public class BuildManager : MonoBehaviour
{
[SerializeField] private GameManager game;
[SerializeField] private Tower[] shop;
[SerializeField] private Button[] shopButtons;
[SerializeField] private Color chosenColor = new Color(1f, 0.85f, 0.3f);
[SerializeField] private GameObject towerPanel;
[SerializeField] private TMP_Text towerNameText;
[SerializeField] private TMP_Text towerStatsText;
[SerializeField] private Button upgradeButton;
[SerializeField] private TMP_Text upgradeLabel;
private Tower chosen;
private Tower selected;
void Start()
{
for (int i = 0; i < shop.Length; i++)
{
Tower prefab = shop[i];
shopButtons[i].GetComponentInChildren<TMP_Text>().text = prefab.data.towerName + "\n" + prefab.data.cost;
shopButtons[i].onClick.AddListener(() => Choose(prefab));
}
Choose(shop[0]);
Select(null);
}
void Choose(Tower prefab)
{
chosen = prefab;
for (int i = 0; i < shop.Length; i++)
{
shopButtons[i].image.color = shop[i] == chosen ? chosenColor : Color.white;
}
}
void Update()
{
if (!Mouse.current.leftButton.wasPressedThisFrame || EventSystem.current.IsPointerOverGameObject())
{
return;
}
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
if (!Physics.Raycast(ray, out RaycastHit hit))
{
Select(null);
return;
}
Tower tower = hit.collider.GetComponentInParent<Tower>();
if (tower != null)
{
Select(tower);
return;
}
Select(null);
if (hit.collider.TryGetComponent(out BuildPad pad))
{
Build(pad);
}
}
void Build(BuildPad pad)
{
if (pad.tower != null)
{
return;
}
if (!game.TrySpend(chosen.data.cost))
{
Debug.Log("Not enough money");
return;
}
pad.tower = Instantiate(chosen, pad.transform.position, Quaternion.identity);
}
void Select(Tower tower)
{
selected = tower;
towerPanel.SetActive(tower != null);
if (tower != null)
{
ShowPanel();
}
}
void ShowPanel()
{
TowerData data = selected.data;
int level = selected.Level;
towerNameText.text = data.towerName + " level " + level;
if (level < data.maxLevel)
{
towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1)
+ "\nRange " + data.RangeAt(level) + " > " + data.RangeAt(level + 1);
upgradeLabel.text = "Upgrade " + data.UpgradeCost(level);
upgradeButton.interactable = true;
}
else
{
towerStatsText.text = "Damage " + data.DamageAt(level) + "\nRange " + data.RangeAt(level);
upgradeLabel.text = "Max level";
upgradeButton.interactable = false;
}
}
public void UpgradeSelected()
{
if (selected.Level >= selected.data.maxLevel)
{
return;
}
if (game.TrySpend(selected.data.UpgradeCost(selected.Level)))
{
selected.Upgrade();
ShowPanel();
}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.