Skip to content

Instantly share code, notes, and snippets.

@antonsem
Last active December 15, 2021 22:07
Show Gist options
  • Save antonsem/7d4b85fd4bd778d6b524af4b253ca41d to your computer and use it in GitHub Desktop.
Save antonsem/7d4b85fd4bd778d6b524af4b253ca41d to your computer and use it in GitHub Desktop.
Feedback_2
// Referanslar
// [1] https://gist.github.com/antonsem/09b4f902ed22adbdf8f664fac539543f
// [2] https://gist.github.com/antonsem/1b34acd82470f34a1fd45160c180834b
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
// [1]'de bahsettiğim gibi Türkçe değişken, sınıf ve metod isimleri kullanmak
// iyi bir fikir değil. Üstelik burada hem Türkçe hem de İngilizce isimler
// kullanılıyor, bir tutarlılık yok.
// Gözüme çarpan ikinci problem bu sınıfın çok büyük olması. İlk bakışta
// gördüğüm kadarıyla bu sınıf hem karakterin hareketlerinden, hem
// animasyonlarından hem konuşmasından hem de alışverişinden (ve kim bilir daha
// nelerden) sorumlu. Bu sınıf en az dört farklı sınıfa bölünebilir
public class Karakter : MonoBehaviour
{
// Görev ayrılığı problemi burada da göze çarpıyor. Hangi değişken nerede,
// kim kimden sorumlu belli değil. Her şey bir arada. Ayrı sınıflara
// ayrılmayacaksa bile bunların farklı gruplara ayrılmasında fayda var.
// Bu değişkenler neden public? Eğer amaç sadece editörden atamak ise
// [2]'de bahsettiğim gibi private yapıp başına [SerializedField] eklemek
// daha mantıklı.
public Rigidbody2D rb;
Animator playeranimator;
Vector3 velocity;
public float walkspeed=4f;
public float jumpspeed = 6f;
bool facingright = true;
// isgrounded ilgili metodun dışında herhangi bir yerde kullanılmıyor
public bool isgrounded = false;
public Transform grouncheckposition;
public float groundcheckradius;
public LayerMask groundchecklayer;
public Transform bullet;
Transform muzzle;
public float bulletspeed;
public int bulletmagazine=5;
public Text bullettext;
// Bunun double olması için özel bir sebep yoksa float fazla fazla işini görecektir
double parasayi = 0;
public Text paratext;
// Health ile can farklı mı? Can herhangi bir yerde kullanılıyor mu?
public int can = 100;
public Text teztext;
int tezsayi = 0;
public float health=100;
// Bu neyin slider'ı? Değişken isimleri anlaşılır olmalı
public Slider slider;
// player objesi bu scriptin olduğu objeden farklı mı? Değilse neden ayrı bir
// değişkeni var?
public GameObject player;
public Vector3 checkpos;
public GameObject brosur;
bool basildi = false;
bool bakkalmi = false;
public Text brosurpara;
public GameObject konusma;
bool konusmahakki = true;
bool tiklandi=false;
// İsimlendirmelerde kullanılan yöntem hiçbir standarda uymadığı gibi okumayı
// zorlaştırıyor. Mesela playeranimator isminde iki kelime var. Ama bunu bir
// bakışta ayırt etmek zor. Onun yerine playerAnimator veya player_animator
// yazılabilir. C# standartlarına göre playerAnimator daha uygun bir yazım
// şekli. C# standartlarına şuaradan ulaşabilirsin:
// https://jesseliberty.com/2020/01/29/c-coding-standards/
// Kendiliğinden ekli olan yorumları silmekte fayda var. Hiçbir işe yaramıyorlar.
// Start is called before the first frame update
void Start()
{
// Eğer Animator oyun başladıktan sonra eklenmiyorsa bunu editörden atamamak
// için bir sebep yok.
playeranimator = GetComponent<Animator>();
// transofrm.GetChild(1) oldukça kötü bir yöntem. Yarın öbür gün o objenin
// birinci çocuğu bir sebepten ötürü değişirse bu kod yanlış çalışacaktır.
// Gördüğüm kadarıyla bu işlemi de start'ta yapmak için bir neden yok. Bu da
// editör'den atanabilir.
muzzle = transform.GetChild(1);
// Bu işlemleri birden fazla defa birçok farklı yerden yapıyorsun. O yüzden
// hepsini birer metoda aktarman daha mantıklı olacaktır. Eğer bir sebepten
// ötürü farklı bir yazı eklemek istersen kodunun farklı yerlerinde aramak
// yerine tek bir yerden değiştirebilirsin.
bullettext.text = "" + bulletmagazine;
paratext.text = "" + parasayi;
teztext.text = "" + tezsayi;
slider.maxValue = health;
slider.value = health;
brosur.SetActive(false);
brosurpara.text = "" + parasayi + "₺";
konusma.SetActive(false);
}
// Metodlar arasına boşluk bırakmak kodu okumayı kolaylaştırır
void walkpc()
{
// Burada Vector3 tanımlayıp sadece iki elemanını, X ve Y'yi atadın.
// Z otomatik olarak 0 atandığı için büyük bir sıkıntı değil, ama ileride kafa
// karıştırabilir. Ayrıca sabit string değişkenleri ayrı bir sınıfta tutmakta
// fayda var. Nasıl yapılacağını şuarada anlattım:
// https://tr.anton.website/sabit-degiskenleri-tutmak/
velocity = new Vector3(Input.GetAxis("Horizontal"), 0f);
// Gördüğüm kadarıyla bu karakterin bir RigidBody'si var. RigidBody olduğu
// zaman objeyi transform ile hareket ettirmek gereksiz ekstra hesaplamalara
// sebep veriyor. Kendi başına çok büyük bir performans kaybına sebep
// olmayacaktır ama akılda tutmakta fayda var.
transform.position += velocity * walkspeed * Time.deltaTime;
// Animasyonlar fiziksel hareketten bağımsız olduğu için en azından farklı bir
// metodda halledilirse çok daha iyi olur.
playeranimator.SetFloat("playerspeed", Mathf.Abs(velocity.x));
}
void jump()
{
// Burada fazladan bir "karakter yerde ise" gibi bir kontrol ekleyebilirsin.
// Şu anda karakter zıpladıktan sonra yere düşmeye başlamadan hemen önce bir
// daha zıplayabilir.
if (Mathf.Approximately(velocity.y, 0)) {
rb.AddForce(Vector2.up * jumpspeed, ForceMode2D.Impulse);
}
}
// Update is called once per frame
void Update()
{
// GetKey metodlarında string yerine KeyCode enum'ını kullanmayı tercih et.
// Input.GetKeyDown(KeyCode.R) gibi.
if (Input.GetKeyDown("r"))
{
shootbullet();
}
// Burada öncelikle karakter yerde mi diye kontrol ediyorsun, sonra yürütüyorsun,
// sonra zıplama tuşuna basmış mı, sonra dikey hızı 0 mı diye kontrol ediyorsun,
// sonra aynı kontrolü bir de w tuşu için yapıyorsun. Daha da sonra yine bu hız
// kontrolünü jump() metodunun içnde yapıyorsun. Eğer karakter yerdeyse dikey
// hızı zaten sıfırdır. Üç kere üst üste kontrol etmene gerek yok bunu.
OnGroundCheck();
walkpc();
if (Input.GetButtonDown("Jump") && Mathf.Approximately(rb.velocity.y, 0) || Input.GetKeyDown(KeyCode.W) && Mathf.Approximately(rb.velocity.y, 0))
{
jump();
}
// basildi diye bir değişken tanımlamışsın ama bu metodu bilmeyen birisi
// neyin basılıp basıldığını bilmeyecek. Değişken isimleri net olmalı, ne işe
// yaradıklarına dair akıllarda soru işareti bırakmamalı. Ayrıca değişkeni
// çok alakasız bir yerde atadığın için burada nelerin döndüğünü anlamak çok
// zor oluyor. Onun yerine ebasildimi() metodu sonucu bool olarak dönse daha
// güzel olur.
ebasildimi();
if (velocity.x<0 && facingright)
{
flipface();
}
else if (velocity.x>0 && !facingright)
{
flipface();
}
// bool'ları kontrol ederken == kullanmana gerek yok. Direkt
// if(basildl && bakkalmi) diyebilirsin.
if (basildi==true && bakkalmi==true) {
brosur.SetActive(true);
}
else if (basildi==false && bakkalmi==false)
{
brosur.SetActive(false);
}
}
void flipface()
{
// Bu durumda karakterin scale'ı ile oynamak çok iyi bir fikir olmayabilir
// çünkü üzerinde bir RigidBody var ve bu durum fizik sisteminin hoşuna
// gitmeyebilir. Ama şimdi alternatif yöntemlere girmeyeceğim
facingright = !facingright;
Vector3 templocalescale = transform.localScale;
templocalescale.x *= -1;
transform.localScale = templocalescale;
}
void OnGroundCheck()
{
isgrounded = Physics2D.OverlapCircle(grouncheckposition.position, groundcheckradius, groundchecklayer);
playeranimator.SetBool("isgroundanim", isgrounded);
}
public void OnTriggerEnter2D(Collider2D other)
{
// tag karşılaştırmasından yine sabit değişken yazımda bahsettim.
// Onun haricinde tag'leri spesifik objeler için değil obje grupları
// için kullanmakta fayda var. Hatta hiç kullanmamakta fayda var ama
// alternatif yöntemler çok farklı bir konu olacağı için
// ayrıntılara girmeyeceğim
if (other.gameObject.tag == "pencil")
{
bulletmagazine = bulletmagazine + 2;
bullettext.text = "" + bulletmagazine;
// Her durumda Destroy'u çağırıyorsun. O yüzden if'lerin dışına
// çıkarabiliriz bunu.
Destroy(other.gameObject);
}
else if (other.gameObject.tag == "para")
{
// burada ve daha sonra float değerlerinin sonuna f yazmadın. Sanırım
// float yerine parayı double olarak tutmanın sebebi bu. Eğer 0.50f
// yazarsan problemin çözülecektir ve double kullanmana gerek olmayacaktır
parasayi= parasayi+ 0.50;
paratext.text = "" + parasayi;
brosurpara.text = "" + parasayi + "₺";
Destroy(other.gameObject);
}
else if (other.gameObject.tag == "Tez")
{
tezsayi++;
teztext.text = "" + tezsayi;
Destroy(other.gameObject);
}
else if (other.gameObject.tag == "Enemy")
{
// Burası olduğu gibi farklı bir class'ta olmalı, ama
// bu da uzun bir konu olduğu için şimdilik es geçiyorum
if (konusmahakki == true)
{
konusma.SetActive(true);
Time.timeScale = 0;
Debug.Log("test1");
konusmahakki = false;
Debug.Log("Test2");
// Burayı anladığım kadarıyla "Eğer düşmana çarptıysam
// ve konuşma hakkım varsa ve E'ye basıyorsam o zaman
// düşman ile konuşayım" gibi bir şey demek istiyorsun.
// Ancak yukarıdaki kodlardan da anladığım kadarıyla bir
// yandan zaman dursun, konuşayım istiyorsun. Öyle bir
// şey olmaz çünkü hem üstteki hem buradaki kodlar bir
// anda çalışacak. Bu nedenle buraya dokunmayacağım.
if (tiklandi == true)
{
Debug.Log("Test4");
parasayi = parasayi - 0.50;
paratext.text = "" + parasayi + "₺";
brosurpara.text = "" + parasayi + "₺";
Destroy(other.gameObject);
Time.timeScale = 1;
konusmahakki = true;
tiklandi = false;
}
}
//player.transform.position = checkpos;
// Bu tarz işlemleri healt -= 20 diye yapabilirsin
// health işlemlerini yaparken hep aynı işi yapıyorsun:
// 1. değeri değiştir
// 2. slider'ın değerini güncelle
// 3. ölüp ölmediğini kontrol et
// bunları bir metoda alabilirsin.
health = health - 20;
slider.value = health;
amidead();
}
}
// Unity'den gelen Update, Start, Awake, OnCollisionEnter gibi metodları
// boş bırakma. Gereksiz yere kodu uzatıp performans kaybına neden oluyorlar.
// Senin yazdığın metodlarda bu kayıp söz konusu değil çünkü Unity kendi
// metodlarını biraz daha farklı bir şekilde çağırıyor. Çok çok ufak bir
// kayıp oluyor bu ama neden olsun :D
private void OnCollisionEnter2D(Collision2D collision)
{
}
private void OnCollisionStay2D(Collision2D collision)
{
// OnCollisionStay kullanmışsın ama kodundan anladığım kadarıyla
// oyuncunun suya veya tuzağa değdiği anda checkpoint'e gitmesini
// istiyorsun. Yani aslında "stay" için bir şey yok. Rahatlıkla
// OnCollisionEnter kullanılabilir.
if (collision.gameObject.tag == "Tuzak")
{
player.transform.position = checkpos;
health = health - 10;
slider.value = health;
amidead();
}
if (collision.gameObject.tag == "Su")
{
player.transform.position = checkpos;
health = health - 50;
slider.value = health;
amidead();
}
}
private void OnTriggerStay2D(Collider2D other)
{
// Burada tag'i bakkal olan bir trigger'da kaldığın sürece
// bakkalmi bool'u true olacak. Ancak farklı bir trigger'a
// girdiğin anda işler karışabilir çünkü metod bu defa
// else'e girecektir. Yine olması gereken şey bakkal'ın kendi
// sınıfının olması ve E'ye basınca oradan bir metodun
// çağırılması. Yine konu uzun olduğu için o ayrıntılara
// girmeyeceğim. Ayrica bu trigger'ın içinde olduğun sürece
// bakkalmi true olacak ve trigger'dan ayrılınca da true
// olarak kalacak. Bu işlemi hiç değilse OnTriggerEnter2D
// ve OnTriggerExit2D ile halletmeyi deneyebilirsin.
if (other.gameObject.tag == "bakkal" )
{
Debug.Log("E basıldı");
bakkalmi = true;
}
else
{
bakkalmi = false;
}
}
public void shootbullet()
{
if (bulletmagazine>0)
{
// Farklı sınıfta olması gereken bir şey daha. Oyuncu kontrolcüsü
// mermi hızı ile falan ilgilenmemeli. En fazla Bullet gibi bir
// component'e sahip bir mermi objesi yaratabilirsin ve içine
// Shoot(Vector3 forward) gibi bir metod tanımlarsın. Sonra
// AddForce vs yerine tempbullet.Shoot(muzzle.forward) diye çağırırsın.
Transform tempbullet;
tempbullet = Instantiate(bullet, muzzle.position, Quaternion.identity);
tempbullet.GetComponent<Rigidbody2D>().AddForce(muzzle.forward * bulletspeed);
bulletmagazine--;
bullettext.text = "" + bulletmagazine;
}
else
{
Debug.Log("Mermi Yok");
}
}
public void amidead()
{
if (health <= 0)
{
slider.value = health;
Destroy(player);
}
}
public void kapat()
{
// Madem ki bu işin için bir metod yazdın neden yukarıda yine
// brosur.SetActive metodunu çağırıyorsun?
brosur.SetActive(false);
}
public void ebasildimi()
{
// Bunun yerine Input.GetKey("e") yazarsan tuşun basılı olduğu
// her karede true döner. Basıldı gibi ekstra bir değişkene
// ihtiyacın yok yani
if (Input.GetKeyDown("e"))
{
Debug.Log("E basıldı2");
basildi = true;
}
else if (Input.GetKeyUp("e"))
{
Debug.Log("Elini çekti");
basildi = false;
}
}
// Metod isimleri hiç anlaşılır değil. Baktığım zaman satinal1 ve
// satinal2 arasındaki farkı anlamak mümkün değil. Metod isimleri
// ne iş yaptıklarını anlatmalı
public void satinal1()
{
if (parasayi>=1)
{
parasayi = parasayi - 1;
paratext.text = "" + parasayi;
bulletmagazine++;
bullettext.text = "" + bulletmagazine;
brosurpara.text = "" + parasayi+ "₺";
Debug.Log("Satin alindi");
}
else if (parasayi<1)
{
Debug.Log("Yetersiz Bakiye");
}
}
public void satinal2()
{
if (parasayi >= 2.5)
{
parasayi = parasayi - 2.5;
paratext.text = "" + parasayi;
health = health + 10;
slider.value = health;
brosurpara.text = "" + parasayi + "₺";
Debug.Log("Satin alindi");
}
else if (parasayi < 2.5)
{
Debug.Log("Yetersiz Bakiye");
}
}
public void paraver()
{
tiklandi = true;
Debug.Log("Test3");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Karakter : MonoBehaviour
{
public Rigidbody2D rb;
Animator playeranimator;
Vector3 velocity;
public float walkspeed=4f;
public float jumpspeed = 6f;
bool facingright = true;
public bool isgrounded = false;
public Transform grouncheckposition;
public float groundcheckradius;
public LayerMask groundchecklayer;
public Transform bullet;
Transform muzzle;
public float bulletspeed;
public int bulletmagazine=5;
public Text bullettext;
double parasayi = 0;
public Text paratext;
public int can = 100;
public Text teztext;
int tezsayi = 0;
public float health=100;
public Slider slider;
public GameObject player;
public Vector3 checkpos;
public GameObject brosur;
bool basildi = false;
bool bakkalmi = false;
public Text brosurpara;
public GameObject konusma;
bool konusmahakki = true;
bool tiklandi=false;
// Start is called before the first frame update
void Start()
{
playeranimator = GetComponent<Animator>();
muzzle = transform.GetChild(1);
bullettext.text = "" + bulletmagazine;
paratext.text = "" + parasayi;
teztext.text = "" + tezsayi;
slider.maxValue = health;
slider.value = health;
brosur.SetActive(false);
brosurpara.text = "" + parasayi + "₺";
konusma.SetActive(false);
}
void walkpc()
{
velocity = new Vector3(Input.GetAxis("Horizontal"), 0f);
transform.position += velocity * walkspeed * Time.deltaTime;
playeranimator.SetFloat("playerspeed", Mathf.Abs(velocity.x));
}
void jump()
{
if (Mathf.Approximately(velocity.y, 0)) {
rb.AddForce(Vector2.up * jumpspeed, ForceMode2D.Impulse);
}
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown("r"))
{
shootbullet();
}
OnGroundCheck();
walkpc();
if (Input.GetButtonDown("Jump") && Mathf.Approximately(rb.velocity.y, 0) || Input.GetKeyDown(KeyCode.W) && Mathf.Approximately(rb.velocity.y, 0))
{
jump();
}
ebasildimi();
if (velocity.x<0 && facingright)
{
flipface();
}
else if (velocity.x>0 && !facingright)
{
flipface();
}
if (basildi==true && bakkalmi==true) {
brosur.SetActive(true);
}
else if (basildi==false && bakkalmi==false)
{
brosur.SetActive(false);
}
}
void flipface()
{
facingright = !facingright;
Vector3 templocalescale = transform.localScale;
templocalescale.x *= -1;
transform.localScale = templocalescale;
}
void OnGroundCheck()
{
isgrounded = Physics2D.OverlapCircle(grouncheckposition.position, groundcheckradius, groundchecklayer);
playeranimator.SetBool("isgroundanim", isgrounded);
}
public void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "pencil")
{
bulletmagazine = bulletmagazine + 2;
bullettext.text = "" + bulletmagazine;
Destroy(other.gameObject);
}
else if (other.gameObject.tag == "para")
{
parasayi= parasayi+ 0.50;
paratext.text = "" + parasayi;
brosurpara.text = "" + parasayi + "₺";
Destroy(other.gameObject);
}
else if (other.gameObject.tag == "Tez")
{
tezsayi++;
teztext.text = "" + tezsayi;
Destroy(other.gameObject);
}
else if (other.gameObject.tag == "Enemy")
{
if (konusmahakki == true)
{
konusma.SetActive(true);
Time.timeScale = 0;
Debug.Log("test1");
konusmahakki = false;
Debug.Log("Test2");
if (tiklandi == true)
{
Debug.Log("Test4");
parasayi = parasayi - 0.50;
paratext.text = "" + parasayi + "₺";
brosurpara.text = "" + parasayi + "₺";
Destroy(other.gameObject);
Time.timeScale = 1;
konusmahakki = true;
tiklandi = false;
}
}
//player.transform.position = checkpos;
health = health - 20;
slider.value = health;
amidead();
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
}
private void OnCollisionStay2D(Collision2D collision)
{
if (collision.gameObject.tag == "Tuzak")
{
player.transform.position = checkpos;
health = health - 10;
slider.value = health;
amidead();
}
if (collision.gameObject.tag == "Su")
{
player.transform.position = checkpos;
health = health - 50;
slider.value = health;
amidead();
}
}
private void OnTriggerStay2D(Collider2D other)
{
if (other.gameObject.tag == "bakkal" )
{
Debug.Log("E basıldı");
bakkalmi = true;
}
else
{
bakkalmi = false;
}
}
public void shootbullet()
{
if (bulletmagazine>0)
{
Transform tempbullet;
tempbullet = Instantiate(bullet, muzzle.position, Quaternion.identity);
tempbullet.GetComponent<Rigidbody2D>().AddForce(muzzle.forward * bulletspeed);
bulletmagazine--;
bullettext.text = "" + bulletmagazine;
}
else
{
Debug.Log("Mermi Yok");
}
}
public void amidead()
{
if (health <= 0)
{
slider.value = health;
Destroy(player);
}
}
public void kapat()
{
brosur.SetActive(false);
}
public void ebasildimi()
{
if (Input.GetKeyDown("e"))
{
Debug.Log("E basıldı2");
basildi = true;
}
else if (Input.GetKeyUp("e"))
{
Debug.Log("Elini çekti");
basildi = false;
}
}
public void satinal1()
{
if (parasayi>=1)
{
parasayi = parasayi - 1;
paratext.text = "" + parasayi;
bulletmagazine++;
bullettext.text = "" + bulletmagazine;
brosurpara.text = "" + parasayi+ "₺";
Debug.Log("Satin alindi");
}
else if (parasayi<1)
{
Debug.Log("Yetersiz Bakiye");
}
}
public void satinal2()
{
if (parasayi >= 2.5)
{
parasayi = parasayi - 2.5;
paratext.text = "" + parasayi;
health = health + 10;
slider.value = health;
brosurpara.text = "" + parasayi + "₺";
Debug.Log("Satin alindi");
}
else if (parasayi < 2.5)
{
Debug.Log("Yetersiz Bakiye");
}
}
public void paraver()
{
tiklandi = true;
Debug.Log("Test3");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Karakter_Refactored : MonoBehaviour
{
#region Exposed Fields
[Header("Controller")]
[SerializedField] private Rigidbody2D rb;
[SerializedField] private float walkSpeed = 4f;
[SerializedField] private float jumpSpeed = 6f;
[SerializedField] private Transform grounCheckPointPosition;
[SerializedField] private float groundCheckRadius;
[SerializedField] private LayerMask groundCheckLayer;
[SerializedField] private float health = 100;
[Header("Weapon")]
[SerializedField] private GameObject bullet;
[SerializedField] private Transform muzzle;
[SerializedField] private float bulletSpeed;
[SerializedField] private int bulletCount = 5;
[Header("Visuals")]
[SerializedField] private Animator playerAnimator;
[Header("UI")]
[SerializedField] private Text bulletText;
[SerializedField] private Text moenyText;
[SerializedField] private Text thesisText;
[SerializedField] private Slider healthSlider;
[SerializedField] private GameObject brochure;
[SerializedField] private Text brochureText;
[SerializedField] private GameObject dialog;
[Header("Other")]
[SerializedField] private Vector3 checkpointPos;
#endregion
#region Private Fields
private bool _isInMarket = false;
private bool _canTalk = true;
private bool _clicked = false;
private bool _isOnTheGround = false;
private float _horizontalInput = 0;
private float _moneyAmount = 0;
private int _thesisCount = 0;
#endregion
#region Unity Methods
private void Start()
{
UpdateBulletText(bulletCount);
UpdateMoneyText(_moneyAmount);
UpdateThesisText(_thesisCount);
InitHealtSlider(health);
brochure.SetActive(false);
dialog.SetActive(false);
}
private void Update()
{
_isOnTheGround = _IsOnTheGround();
Walk();
if(CanJump())
{
Jump();
}
SetAnimations();
brochure.SetActive(Input.GetKey(KeyCode.E) && _isInMarket);
}
private void OnTriggerEnter2D(Collider2D other)
{
if(other.gameObject.CompareTag(Constants.Tags.market))
{
_isInMarket = true;
return;
}
if(other.gameObject.CompareTag(Constants.Tags.pencil))
{
UpdateBulletCount(bulletCount + 2);
}
else if(other.gameObject.CompareTag(Constants.Tags.money))
{
UpdateMoney(_moneyAmount + 0.5f);
}
else if(other.gameObject.CompareTag(Constants.Tags.thesis))
{
UpdateThesis(_thesisCount + 1);
}
else if(other.gameObject.CompareTag(Constants.Tags.enemy))
{
// I didn't quite understand what suppose to happen here,
// so I'll skip it.
if (_canTalk == true)
{
dialog.SetActive(true);
Time.timeScale = 0;
_canTalk = false;
if (_clicked == true)
{
UpdateMoney(_moneyAmount - 0.50f);
Time.timeScale = 1;
_canTalk = true;
_clicked = false;
}
}
}
Destroy(other.gameObject);
UpdateHealth(health - 20);
}
private void OnTriggerExit2D(Collider2D other)
{
if(other.gameObject.CompareTag(Constants.Tags.market))
{
_isInMarket = false;
}
}
private void OnCollisionEnter2D(Collision2D other)
{
if(other.gameObject.CompareTag(Constants.Tags.trap))
{
player.transform.position = checkpointPos;
UpdateHealth(health - 10);
}
else if(other.gameObject.CompareTag(Constants.Tags.water))
{
player.transform.position = checkpointPos;
UpdateHealth(health - 50);
}
}
#endregion
#region Movement
private void Walk()
{
float verticalVelocity = rb.velocity.y;
_horizontalInput = Input.GetAxis(Constants.Strings.horizontal);
rb.velocity = new Vector2(_horizontalInput * walkSpeed, verticalVelocity);
}
private bool CanJump()
{
return Mathf.Approximately(rb.velocity.y, 0) && _isOnTheGround;
}
private void DoJump()
{
rb.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse);
}
private bool _IsOnTheGround()
{
return Physics2D.OverlapCircle(grounCheckPointPosition.positCon, R, C);
L }
private void SetAnimations()
{
if(transform.localScale.x * rb.velocity.x < 0)
{
Vector3 temp = transform.localScale;
temp.x = Mathf.Sign(rb.velocity.x);
transform.localScale.x = temp;
}
playerAnimator.SetFloat(Constants.Animations.playerSpeedHash, Mathf.Abs(_horizontalInput));
playerAnimator.SetBool(Constants.Animations.playerGroundedHash, _isOnTheGround);
}
#endregion
#region Market Methods
public void BuyBullet()
{
if(_moneyAmount < 1)
{
return;
}
UpdateMoney(_moneyAmount - 1);
UpdateBulletCount(bulletCount + 1);
}
public void BuyHealth()
{
if(_moneyAmount < 1)
{
return;
}
UpdateMoney(-2.5f);
UpdateHealth(health + 10);
}
#endregion
#region Update Methods
private void UpdateBulletCount(int count)
{
bulletCount = count;
UpdateBulletText(count);
}
private void UpdateBulletText(int count)
{
bulletText.text = count.ToString();
}
private void UpdateMoney(float newAmount)
{
_moneyAmount = newAmount;
UpdateMoneyText(newAmount);
}
private void UpdateMoneyText(float newAmount)
{
moenyText.text = _moneyAmount.ToString();
brochureText.text = $"{newAmount.ToString()}₺";
}
private void UpdateThesis(int newAmount)
{
_thesisCount = newAmount;
UpdateThesisText(newAmount);
}
private void UpdateThesisText(int newAmount)
{
thesisText.text = newAmount.ToString();
}
private void UpdateHealthSliderValue(float healthValue)
{
healthSlider.value = healthValue;
}
private void UpdateHealth(float newAmount)
{
healt += newAmount;
UpdateHealthSliderValue(healt);
if(healt <= 0)
{
Destroy(gameObject);
}
}
private void InitHealtSlider(float maxHealt)
{
healthSlider.maxValue = healthValue;
SetMaxHealthValue(healthValue);
}
#endregion
private void Shoot()
{
if(bulletCount < 0)
{
return;
}
Transform temp = Instantiate(bullet, muzzle.position, Quaternion.identity).transform;
temp.GetComponent<Rigidbody2D>().AddForce(muzzle.forward * S);
UpdateBulletCount(bulletCount - 1);
}
}
// This should be in a seperate file
namespace Constants
{
public static class Animations
{
public static readonly int playerSpeedHash = Animator.StringToHash("playerSpeed");
public static readonly int playerGroundedHash = Animator.StringToHash("isGroundAnim");
}
public static class Strings
{
public const string horizontal = "Horizontal";
}
public static class Tags
{
public const string pencil = "Pencil";
public const string money = "Money";
public const string thesis = "Thesis";
public const string enemy = "Enemy";
public const string market = "Market";
public const string trap = "Trap";
public const string water = "Water";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment