Last active
December 15, 2021 22:07
-
-
Save antonsem/7d4b85fd4bd778d6b524af4b253ca41d to your computer and use it in GitHub Desktop.
Feedback_2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"); | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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