paint-brush
Unity'de 2D Karakter Kontrol Cihazı Nasıl Oluşturulur: Bölüm 1ile@deniskondratev
561 okumalar
561 okumalar

Unity'de 2D Karakter Kontrol Cihazı Nasıl Oluşturulur: Bölüm 1

ile Denis Kondratev15m2024/04/22
Read on Terminal Reader

Çok uzun; Okumak

Bu makale, Unity'de bir 2D karakter denetleyicisi oluşturma sürecini ele alıyor ve karakter hareketini basitleştiren 'Rigidbody2D' için yeni bir 'Slide' yönteminin entegre edilmesine odaklanıyor. Kurulumu, fiziksel davranışları, çarpışma yönetimini ve hareket kısıtlamalarını kapsamakta ve çeşitli 2D platform oyunlarına uyarlanabilen ve genişletilebilen bir karakter denetleyicisi geliştirmek için temel bir kılavuz sağlamaktadır.
featured image - Unity'de 2D Karakter Kontrol Cihazı Nasıl Oluşturulur: Bölüm 1
Denis Kondratev HackerNoon profile picture
0-item
1-item
2-item


Herhangi bir 2D platformun temel unsurlarından biri ana karakterdir. Hareket etme ve kontrol edilme şekli, ister rahat, eski tarz bir oyun, ister dinamik bir slasher olsun, oyunun atmosferini önemli ölçüde şekillendirir. Bu nedenle, bir Karakter Kontrol Cihazı oluşturmak, bir platform oyunu geliştirmenin önemli bir erken aşamasıdır.


Bu yazıda sıfırdan bir karakter yaratma sürecini kapsamlı bir şekilde inceleyeceğiz, ona fizik yasalarına bağlı kalarak seviyede hareket etmeyi öğreteceğiz. Karakter Kontrolörleri oluşturma konusunda zaten deneyiminiz olsa bile, Unity 2023'teki yenilikler hakkında bilgi edinmek ilginizi çekecektir. Şaşırtıcı bir şekilde, Rigidbody2D bileşeni için uzun zamandır beklenen bir Slide yöntemi eklendi ve bu, karakter denetleyicisi yazmayı büyük ölçüde kolaylaştırıyor. Rigidbody2D Kinematik modda daha etkili kullanılmasına olanak tanır. Daha önce tüm bu işlevlerin manuel olarak uygulanması gerekiyordu.


Yalnızca makaleyi okumakla kalmayıp aynı zamanda pratikte denemek istiyorsanız, gerekli varlıkların ve karakterinizi test etmek için hazır bir seviyenin zaten dahil edildiği GitHub deposu Treasure Hunters'dan bir seviye şablonu indirmenizi öneririm.


Karakterimizin Temelini Atıyoruz

Platform oyunumuz için oyunun yalnızca dikey ve yatay yüzeylere sahip olacağı ve yerçekimi kuvvetinin kesinlikle aşağıya doğru yönlendirileceği yönünde bir kural belirledik. Bu, özellikle vektör matematiğine dalmak istemiyorsanız, ilk aşamada platform oyununun oluşturulmasını önemli ölçüde basitleştirir.


Gelecekte, Unity'de bir 2D platform oyunu için mekaniklerin oluşturulmasını araştırdığım Hazine Avcıları projemde bu kurallardan sapabilirim. Ama bu başka bir yazının konusu olacak.


Hareketin yatay yüzeyler boyunca yapılması kararımıza göre karakterimizin tabanı dikdörtgen olacaktır. Eğimli yüzeylerin kullanılması, kapsül şeklinde bir çarpıştırıcının ve kayma gibi ek mekaniklerin geliştirilmesini gerektirecektir.


Öncelikle sahnede boş bir nesne oluşturun ve ona Kaptan adını verin; bu bizim ana karakterimiz olacak. Rigidbody2D ve BoxCollider2D bileşenlerini nesneye ekleyin. Unity'nin yerleşik fizik yeteneklerini kullanırken karakterin hareketini kontrol edebilmemiz için Rigidbody2D türünü Kinematic olarak ayarlayın. Ayrıca Z Döndürmeyi Dondur seçeneğini etkinleştirerek karakterin Z ekseni boyunca dönüşünü kilitleyin.


Kurulumunuz aşağıdaki resimdeki gibi görünmelidir.


Şimdi kaptanımıza bir görünüm ekleyelim. Varlıklar/Dokular/Hazine Avcıları/Kaptan Palyaço Burun/Sprites/Kaptan Palyaço Burun/Kılıçlı Kaptan Palyaço Burun/09-Idle Sword/Idle Sword 01.png içindeki dokuyu bulun ve Birim Başına Piksel değerini 32 olarak ayarlayın. Bu kursta bu değeri kullanın çünkü dokularımız bu çözünürlükle oluşturulmuştur. Sprite Modu'nu Tekli olarak ayarlayın ve kolaylık sağlamak için Pivot'u Alt'a ayarlayın. Uygula butonuna tıklayarak değişiklikleri uygulamayı unutmayın. Tüm ayarların doğru yapıldığından emin olun.



Bu yazıda karakter animasyonuna değinmeyeceğiz, bu yüzden şimdilik yalnızca bir sprite kullanacağız. Kaptan nesnesinde, Görünüm adında iç içe geçmiş bir nesne oluşturun ve önceden yapılandırılmış hareketli grafiği belirterek buna bir Sprite Oluşturucu bileşeni ekleyin.



Kaptanın resmini yakınlaştırdığımda yanlış sprite ayarlarından dolayı oldukça bulanık olduğunu fark ettim. Bunu düzeltmek için Proje penceresinde Idle Sword 01 dokusunu seçin ve Filtre Modunu Nokta (filtre yok) olarak ayarlayın. Artık görüntü çok daha iyi görünüyor.


Karakter Çarpıştırıcı Kurulumu

Şu anda çarpıştırıcının konumu ile kaptanımızın görüntüsü birbirine uymuyor ve çarpıştırıcının ihtiyacımıza göre çok büyük olduğu ortaya çıkıyor.

Bunu düzeltelim ve ayrıca karakterin pivotunu alt tarafa doğru şekilde yerleştirelim. Boyutu ne olursa olsun aynı seviyeye yerleştirilmesini kolaylaştırmak için bu kuralı oyundaki tüm nesnelere uygulayacağız.


Bu süreci yönetme kolaylığı için, aşağıda gösterildiği gibi Pivot seti ile Takım Kolu Konumunu Değiştir'i kullanın.


Bir sonraki adım, kahramanımızın çarpıştırıcısını, pivot noktası tam olarak altta olacak şekilde ayarlamaktır. Çarpıştırıcının boyutu, karakterin boyutlarıyla tam olarak eşleşmelidir. Gerekli hassasiyeti elde etmek için çarpıştırıcının Ofset ve Boyut parametrelerinin yanı sıra iç içe Görünüm nesnesinin konumunu da ayarlayın.


Çarpıştırıcının Offset.X parametresine özellikle dikkat edin: değeri kesinlikle 0 olmalıdır. Bu, çarpıştırıcının nesnenin merkezine göre simetrik yerleşimini sağlayacaktır; bu, sonraki karakter dönüşleri için son derece önemlidir; değer burada Transform.Scale.X'in değeri -1 ve 1 olarak değiştirildi. Çarpıştırıcı yerinde kalmalı ve görsel dönüş doğal görünmelidir.


Karakterlerin Fiziksel Davranışlarına Giriş

Her şeyden önce, karakterlere (ana kahraman, NPC'ler veya düşmanlar) fiziksel dünyayla etkileşim kurmayı öğretmek önemlidir. Örneğin karakterler düz bir yüzeyde yürüyebilmeli, üzerinden atlayabilmeli ve yerçekimi kuvvetine maruz kalarak onları yere geri çekebilmelidir.


Unity, cisimlerin hareketini kontrol eden, çarpışmaları yöneten ve nesneler üzerindeki dış kuvvetlerin etkisini ekleyen yerleşik bir fizik motoruna sahiptir. Bunların hepsi Rigidbody2D bileşeni kullanılarak uygulanır. Ancak karakterler için fiziksel dünyayla etkileşime giren ve geliştiricilere nesnenin davranışı üzerinde daha fazla kontrol sağlayan daha esnek bir araca sahip olmak faydalıdır.


Daha önce de belirttiğim gibi Unity'nin önceki sürümlerinde geliştiricilerin tüm bu mantığı kendilerinin uygulaması gerekiyordu. Ancak Unity 2023'te Rigidbody2D bileşenine yeni bir Slide yöntemi eklendi ve bu, gerçekleştirilen hareket hakkında gerekli tüm bilgileri sağlarken fiziksel nesnenin esnek bir şekilde kontrol edilmesine olanak sağladı.


Karakterlerin fiziksel dünyada taşınmasına ilişkin temel mantığı içerecek bir CharacterBody sınıfı oluşturarak başlayalım. Bu sınıf zaten karakterimize eklediğimiz Rigidbody2D Kinematic modda kullanacaktır. Yani ilk şey bu bileşene bir referans eklemek.


 public class CharacterBody : MonoBehaviour { [SerializeField] private Rigidbody2D _rigidbody; }


Bazen karakter hareketinin dinamikleri için yerçekiminin normalden daha güçlü hareket etmesi gerekir. Bunu başarmak için başlangıç değeri 1 olan bir yerçekimi etki faktörü ekleyeceğiz ve bu faktör 0'dan küçük olamaz.


 [Min(0)] [field: SerializeField] public float GravityFactor { get; private set; } = 1f;


Ayrıca hangi nesnelerin geçilmez yüzeyler olarak kabul edileceğini de tanımlamamız gerekiyor. Bunu yapmak için gerekli katmanları belirlememize izin veren bir alan oluşturacağız.


 [SerializeField] private LayerMask _solidLayers;


Örneğin yer çekimi dahil bazı dış etkenler nedeniyle aşırı yüksek hızlar geliştirmelerini önlemek için karakterin hızını sınırlayacağız. Başlangıç değerini 30 olarak ayarladık ve denetçide 0'dan küçük bir değer ayarlama olanağını sınırladık.


 [Min(0)] [SerializeField] private float _maxSpeed = 30;


Bir yüzey boyunca hareket ederken, eğer aralarındaki mesafe yeterince küçükse, karakterin her zaman yüzeye tutunmasını isteriz.


 [Min(0)] [SerializeField] private float _surfaceAnchor = 0.01f;


Her ne kadar oyunumuzdaki yüzeylerin sadece yatay veya dikey olacağına karar vermiş olsak da her ihtimale karşı karakterin sabit durabileceği yüzeyin maksimum eğim açısını 45° başlangıç değeriyle belirleyeceğiz.


 [Range(0, 90)] [SerializeField] private float _maxSlop = 45f;


Denetleyici aracılığıyla karakterin mevcut hızını ve durumunu da görmek istiyorum, bu yüzden SerializeField özelliğine sahip iki alan ekleyeceğim.


 [SerializeField] private Vector2 _velocity; [field: SerializeField] public CharacterState State { get; private set; }


Evet, burada yeni ama tanımlanmamış bir varlık CharacterState tanıttım. Bu konuyu daha detaylı tartışacağız.


Karakter Durumları

Platform oyunumuzun gelişimini basitleştirmek için sadece iki ana karakter durumunu tanımlayalım.

Birincisi, karakterin yüzeyde güvenli bir şekilde durduğu durum olan Topraklanmış'tır . Bu durumda karakter yüzeyde serbestçe hareket edebilir ve oradan atlayabilir.


İkincisi, karakterin havada olduğu bir serbest düşme durumu olan Airborne'dur . Karakterin bu durumdaki davranışı, platformun özelliklerine bağlı olarak değişebilir. Gerçeğe yakın genel bir durumda, karakter ilk momentumun etkisi altında hareket eder ve davranışını etkileyemez. Bununla birlikte, platform oyunlarında fizik genellikle kolaylık ve oynanış dinamikleri lehine basitleştirilmiştir: örneğin birçok oyunda, serbest düşüşte bile karakterin yatay hareketini kontrol edebiliriz. Bizim durumumuzda, popüler çift atlama mekaniğinin yanı sıra, havada ek bir sıçramaya izin veren bu da mümkündür.


Karakterimizin durumlarını kodda temsil edelim:


 /// <summary> /// Describes the state of <see cref="CharacterBody"/>. /// </summary> public enum CharacterState { /// <summary> /// The character stays steady on the ground and can move freely along it. /// </summary> Grounded, /// <summary> /// The character is in a state of free fall. /// </summary> Airborne }


Çok daha fazla devletin olabileceğini belirtmekte fayda var. Örneğin, oyun eğimli yüzeyler içeriyorsa karakter sağa veya sola serbestçe hareket edemediği ancak yokuş aşağı kayabileceği bir kayma durumunda olabilir. Böyle bir durumda, karakter de eğimden iterek atlayabilir, ancak yalnızca eğim yönünde. Bir başka olası durum da, yerçekiminin etkisinin zayıfladığı ve karakterin yatay olarak itilebildiği dikey bir duvar boyunca kaymadır.


Hareket Hızı Sınırlaması

Zaten özel bir alan _velocity tanımlamıştık ancak karakterin maksimum hızını sınırlandırırken bu değeri dışarıdan alıp ayarlayabilmemiz gerekiyor. Bu, verilen hız vektörünün izin verilen maksimum hız ile karşılaştırılmasını gerektirir.


Bu, hız vektörünün uzunluğunun veya matematiksel anlamda büyüklüğünün hesaplanmasıyla yapılabilir. Vector2 yapısı zaten bunu yapmamızı sağlayan bir magnitude özelliği içeriyor. Bu nedenle, eğer geçirilen vektörün büyüklüğü izin verilen maksimum hızı aşarsa, vektörün yönünü korumalı ancak büyüklüğünü sınırlamalıyız. Bunun için _maxSpeed normalleştirilmiş hız vektörüyle çarpıyoruz (normalleştirilmiş bir vektör, aynı yönde ancak 1 büyüklüğünde bir vektördür).


İşte kodda nasıl göründüğü:


 public Vector2 Velocity { get => _velocity; set => _velocity = value.magnitude > _maxSpeed ? value.normalized * _maxSpeed : value; }


Şimdi bir vektörün büyüklüğünün nasıl hesaplandığına yakından bakalım. Aşağıdaki formülle tanımlanır:



Karekökün hesaplanması kaynak yoğun bir işlemdir. Çoğu durumda hız maksimumu aşmasa da yine de bu karşılaştırmayı döngü başına en az bir kez yapmamız gerekir. Ancak vektörün büyüklüğünün karesini maksimum hızın karesiyle karşılaştırırsak bu işlemi önemli ölçüde basitleştirebiliriz.


Bunun için maksimum hızın karesini saklayacak ek bir alan tanıtıyoruz ve bunu Awake yönteminde bir kez hesaplıyoruz:


 private float _sqrMaxSpeed; private void Awake() { _sqrMaxSpeed = _maxSpeed * _maxSpeed; }


Artık hızın ayarlanması daha optimum şekilde gerçekleştirilebilir:


 public Vector2 Velocity { get => _velocity; set => _velocity = value.sqrMagnitude > _sqrMaxSpeed ? value.normalized * _maxSpeed : value; }


Böylece gereksiz hesaplamaların önüne geçiyor ve karakterin hareket hızını işleme performansını artırıyoruz.


Sert Cisim Hareket Yöntemi

Daha önce de belirttiğim gibi Unity, CharacterBody geliştirilmesini büyük ölçüde kolaylaştıracak yeni bir Slide() yöntemi ekledi. Ancak bu yöntemi kullanmadan önce nesnenin uzayda hareket edeceği kuralların tanımlanması gerekir. Bu davranış Rigidbody2D.SlideMovement yapısı tarafından ayarlanır.


Yeni bir alan olan _slideMovement tanıtalım ve değerlerini ayarlayalım.


 private Rigidbody2D.SlideMovement _slideMovement; private void Awake() { _sqrMaxSpeed = _maxSpeed * _maxSpeed; _slideMovement = CreateSlideMovement(); } private Rigidbody2D.SlideMovement CreateSlideMovement() { return new Rigidbody2D.SlideMovement { maxIterations = 3, surfaceSlideAngle = 90, gravitySlipAngle = 90, surfaceUp = Vector2.up, surfaceAnchor = Vector2.down * _surfaceAnchor, gravity = Vector2.zero, layerMask = _solidLayers, useLayerMask = true, }; }



maxIterations , bir nesnenin çarpışma sonucunda kaç kez yön değiştirebileceğini belirlediğini açıklamak önemlidir. Örneğin, karakter havada bir duvarın yanındaysa ve oyuncu yerçekimi ona etki ederken onu sağa doğru hareket ettirmeye çalışırsa. Böylece Slide() yöntemine yapılan her çağrı için sağa ve aşağıya doğru yönlendirilmiş bir hız vektörü ayarlanacaktır. Duvara çarpıldığında hareket vektörü yeniden hesaplanır ve nesne aşağı doğru hareket etmeye devam eder.


Böyle bir durumda, eğer maxIterations değeri 1 olarak ayarlanmışsa, nesne duvara çarpacak, duracak ve fiilen orada sıkışıp kalacaktır.


maxIterations ve layerMask değerleri daha önce tanımlanmıştı. Diğer alanlarla ilgili daha ayrıntılı bilgi için resmi yapı belgelerine bakın.


Son olarak Karakteri Taşımak

Artık Kaptan'ın harekete geçmesi için her şey hazır. Bunu, Unity'de fiziği işlemek için tasarlanmış bir geri arama olan FixedUpdate yapacağız. Geçtiğimiz birkaç yılda Unity ekibi 2 boyutlu fiziğin kullanımını önemli ölçüde geliştirdi. Şu anda işleme, Update geri aramasında veya hatta gerekli yöntemi kendi başınıza çağırarak yapılabilir.


Ancak bu örnekte geleneksel ve kanıtlanmış FixedUpdate yöntemini kullanacağız. Devam etmeden önce Time.fixedDeltaTime değeri hakkında birkaç söz söylemekte fayda var.


Oyun fiziğinde öngörülebilirliği sağlamak için simülasyon, sabit zaman aralıklarında yinelemeler halinde gerçekleştirilir. Bu, FPS veya gecikmelerdeki değişikliklerin nesne davranışını etkilemeyeceğini garanti eder.


Her döngünün başında yerçekiminin nesne üzerindeki etkisini hesaba katacağız. Yer çekimi serbest düşme ivmesi vektörü tarafından verildiğinden, nesnenin hızındaki Δv değişiminin Δt zamanına göre değişimini aşağıdaki formülle hesaplayabiliriz:




burada a nesnenin sabit ivmesidir. Bizim durumumuzda, tanıttığımız katsayı dikkate alındığında bu, yerçekiminden kaynaklanan ivmedir — Physics2D.gravity * GravityFactor . Bu nedenle Δv şu şekilde hesaplanabilir:


 Time.fixedDeltaTime * GravityFactor * Physics2D.gravity


Hızı değiştirdiğimiz nihai sonuç şöyle görünür:


 Velocity += Time.fixedDeltaTime * GravityFactor * Physics2D.gravity;


Artık karakterin sert cisim hareketini gerçekleştirebiliriz:


 var slideResults = _rigidbody.Slide( _velocity, Time.fixedDeltaTime, _slideMovement);


slideResults değişkeni, SlideResults yapısının bir değeridir ve hareketin sonuçlarını saklar. Bizim için bu sonucun ana alanları, hareket sırasında yüzeyle çarpışmanın sonucu olan slideHit ve karakterin sabit bir yüzey üzerinde durup durmadığını belirlemeye yardımcı olacak aşağı doğru atışın sonucu olan surfaceHit .


Çarpışmalarla Başa Çıkma

Yüzeylere çarparken karakterin o yüzeye doğru hızını sınırlamak çok önemlidir. Basit bir örnek, eğer karakter yerde hareketsiz duruyorsa, yer çekiminin etkisi altında hız kazanmaya devam etmemelidir. Her döngünün sonunda hızları sıfır olmalıdır. Benzer şekilde yukarı doğru hareket edip tavana çarptığında karakterin tüm dikey hızını kaybetmesi ve aşağı doğru hareket etmeye başlaması gerekir.


Çarpışmaların sonuçları, slideHit ve surfaceHit , çarpışma yüzeyinin normalini içeren RaycastHit2D yapısının değerleriyle temsil edilir.


Hız sınırlaması, orijinal hız vektörünün çarpışma normali üzerindeki izdüşümü hız vektörünün kendisinden çıkarılarak hesaplanabilir. Bu nokta çarpımı kullanılarak yapılır. Bu işlemi gerçekleştirecek bir yöntem yazalım:


 private static Vector2 ClipVector(Vector2 vector, Vector2 hitNormal) { return vector - Vector2.Dot(vector, hitNormal) * hitNormal; }


Şimdi bu yöntemi FixedUpdate entegre edelim. Burada, surfaceHit için hızı yalnızca aşağı doğru yönlendirilirse sınırlayacağız, çünkü nesnenin yüzeyde olup olmadığını belirleyen alçı her zaman yerle teması kontrol etmek için gerçekleştirilir.


 private void FixedUpdate() { Velocity += Time.fixedDeltaTime * GravityFactor * Physics2D.gravity; var slideResults = _rigidbody.Slide( _velocity, Time.fixedDeltaTime, _slideMovement); if (slideResults.slideHit) { _velocity = ClipVector(_velocity, slideResults.slideHit.normal); } if (_velocity.y <= 0 && slideResults.surfaceHit) { var surfaceHit = slideResults.surfaceHit; _velocity = ClipVector(_velocity, surfaceHit.normal); } }


Bu uygulama, karakterin hareketinin doğru bir şekilde yönetilmesine, çeşitli yüzeylerle çarpışırken istenmeyen hızlanmanın önlenmesine ve oyundaki karakterlerin hareketlerinin öngörülebilir ve pürüzsüz tutulmasına olanak tanır.


Karakterin Durumunu Belirleme

Her döngünün sonunda, karakterin katı bir yüzey üzerinde mi (Yerlenmiş durum) yoksa serbest düşüşte mi (veya bizim tanımladığımız şekliyle kontrollü düşme - Havada kalma durumu) olup olmadığının belirlenmesi gerekir.


Karakterin Topraklanmış durumda olduğunu düşünmek için öncelikle dikey hızlarının sıfır veya negatif olması gerekir ve bunu _velocity.y değeriyle belirleriz.


Bir diğer önemli kriter ise Rigidbody hareket sonuçlarından yani surfaceHit varlığıyla tespit ettiğimiz karakterin ayaklarının altında bir yüzeyin varlığıdır.


Üçüncü faktör ise bu yüzeyin normaline yani surfaceHit.normal değerine göre analiz ettiğimiz yüzeyin eğim açısıdır. Bu açıyı, karakterin sabit durabileceği yüzeyin mümkün olan maksimum açısı olan _maxSlop ile karşılaştırmak gerekir.


Tamamen dikey bir yüzey için normal kesinlikle yatay olacaktır, yani vektör değeri (1, 0) veya (-1, 0) olacaktır. Yatay bir yüzey için normalin değeri (0, 1) olacaktır. Eğim açısı ne kadar küçük olursa, y değeri o kadar büyük olur. alpha açısı için bu değer şu şekilde hesaplanabilir:



Açımız derece cinsinden verildiğinden ve $\cos$ fonksiyonu radyan gerektirdiğinden, formül şuna dönüştürülür:



Bunun için yeni bir alan tanıtalım ve bunu Awake metodunda hesaplayalım.


 private float _minGroundVertical; private void Awake() { _minGroundVertical = Mathf.Cos(_maxSlop * Mathf.PI / 180f); //... }


Şimdi yukarıdaki koşulların tümünü kontrol ederek, FixedUpdate kodumuzu güncelleyelim.


 if (_velocity.y <= 0 && slideResults.surfaceHit) { var surfaceHit = slideResults.surfaceHit; Velocity = ClipVector(_velocity, surfaceHit.normal); State = surfaceHit.normal.y >= _minGroundVertical ? CharacterState.Grounded : CharacterState.Airborne; } else { State = CharacterState.Airborne; }


Bu mantık, karakterin ne zaman yerde olduğunu doğru bir şekilde belirlememize ve durumundaki değişikliklere doğru şekilde yanıt vermemize olanak tanıyacak.


Kaptan'a CharacterBody ekleme

Artık CharacterBody bileşenimiz hazır olduğuna göre son adım onu Kaptanımıza eklemektir. Sahnede Captain nesnesini seçin ve CharacterBody bileşenini ona ekleyin.

Rigidbody'yi yukarıdaki çizimde gösterildiği gibi yapılandırmayı unutmayın. Yerçekimi Faktörünü 3'e ayarlayın ve Katı Katman için Varsayılan seçeneğini seçin.


Artık oyuna başlayabilir ve karakterimizin sahnede nasıl hareket ettiğini gözlemlemek için Hız için farklı değerler ayarlamayı deneyebilirsiniz.

Şimdilik Özetliyoruz

Elbette yine de karakter kontrolleri eklememiz gerekiyor. Ancak bu makale zaten oldukça uzun oldu, bu yüzden bir sonraki makalede yeni Giriş Sistemini kullanarak karakterin kontrolünü detaylandıracağım: "Unity'de 2D Karakter Denetleyicisi Oluşturma: Bölüm 2."


Bu makalede açıklanan projenin tamamını buradan indirebilirsiniz: Hazine Avcıları ve herhangi bir zorlukla karşılaşırsanız pratikte her şeyi kontrol edebilirsiniz. Bir karakter denetleyicisi geliştirmek, 2D platform oyunu oluşturmanın önemli bir unsurudur çünkü oyunun daha da geliştirilmesini belirler. Ana kahramanın veya düşmanların davranışlarına yeni özelliklerin ne kadar kolay ekleneceğini etkiler. Bu nedenle kendi oyununuzu bağımsız olarak geliştirebilmek için temelleri anlamak çok önemlidir.