Birlikteki 2D karakter denetleyicisi (eski okul platformcularını geri almaya çalışıyor)


11

Bu gün (phisics kullanarak) birlik ile bir 2D karakter denetleyicisi oluşturmaya çalışıyorum. Fizik motorları için oldukça yeniyim ve aradığım kontrolü hissetmek gerçekten zor. Herkes bulduğum bir sorun için çözüm önermek gerçekten mutlu olurdu:

Bu benim FixedUpdate'ım şu an:

public void FixedUpdate()
{
    Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
    _body.AddForce(v);

    v.y=0;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.velocity=v;

    Debug.Log("Velocity: "+_body.velocity);
}

Burada sadece sol ve sağ için bir yerçekimi ve doğrusal kuvvet uygulayarak sert gövdeyi hareket ettirmeye çalışıyorum. Hareket ederken zıplama ve 0 sürtünme ve hareketsiz dururken 1 sürtünme yapmayan bir fizik malzeme ayarladım. Asıl sorun, eğimli çarpıştırıcılara sahip olmam ve hızın yukarı (daha yavaş), yokuştan aşağı (daha hızlı) gitmesi ve düz bir çarpıştırıcıda (normal) yürümesi. Bu nasıl düzeltilebilir? Gördüğünüz gibi x ekseni için her zaman aynı hızı uyguluyorum.

Oyuncu için kuvvetleri uyguladığım katı cisim olan ayak pozisyonunda bir küre ile ayarladım.

Bununla hayatımı kolaylaştıracak diğer ipuçlarını bekliyoruz :).

PD Eve gelirken, oyuncunun yürüdüğü yüzeye paralel sabit bir kuvvet uygulayarak bunu çözebileceğimi fark ettim, ancak en iyi yöntem olup olmadığını bilmiyorum.


4
Eski okul platformerleri atlama mekaniği ve doğrudan hız kontrolü (yani hiç fizik yok) için elle ayarlanmış "karikatür fiziği" kullandılar. Karakter denetleyicisini yeniden yazabilirseniz, bunu yapın, çünkü eski okul oyunlarının sahip olduğu keskin hareketlere yumuşacık bir fizik simülasyonu dürtmek ve prodüksiyon yapmak zor olacaktır.
Patrick Hughes

Özel bir tane yazma sorunu, çarpışma tespitinin kaybedilmesidir. Ve raycast kullanmadan yeniden inşa etmek kolay değildir (çevreye bağlı olarak, vb ... bir demet olabilir). Bu durumlarla nasıl başa çıkıyorsunuz?
Notbad

Kinematik sert gövdeleri kullandığınızda, hala özel animasyonlu şeyler üzerinde çarpıştırıcılara sahip olabilirsiniz. Çoğu durumda bu tür bir uygulama için gerçek dünya fiziği / kuvvetleri vb. İstemediğinizi garanti ederim. Daha teknik bir açı arıyorsanız belki de Human IK
Runonthespot

1
Bu durumda hendek fiziğini tanımlayın.
Ray_Garner

Yanıtlar:


7

Eski okul platformcularını taklit etmek istiyorsanız, birinci adım fiziği tamamen terk etmektir. Sonunda, eski bir okul platformcunun gerçekçi olmayan hareketini elde etmek için fizik sistemi ile savaşacaksınız. Uygulamanın bir yolu hakkında iyi bir fikir edinmek için fiziği tamamen terk eden bu CharacterController değişimine bir göz atın .


3

Muhtemelen mheona'nın önerdiği şeylerle daha mutlu olurdunuz. Ancak Unity'nin fiziğini kullanacaksanız, muhtemelen kullanmak istersiniz ForceMode.VelocityChange.

Misal:

public void FixedUpdate()
{
    var v = Vector3.zero;
    if(state(MovementState.Left))
    {
        v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
    }
    else if(state(MovementState.Right))
    {
        v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
        if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
    }

    _body.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

Ayrıca, projenizin Fizik ayarlarında küresel yerçekimini uygulamalısınız ve daha hızlı düşmek istediğiniz nesneler için bir Sabit Kuvvet bileşeni ekleyin .

ForceMode.Impulsebenzerdir ancak katı cismin kütlesinden etkilenir. Ayarlamayı zorlaştırır.


2

Yerleşik Karakter Denetleyici bileşeninden (benim yaptığım gibi) hoşlanmasanız bile, Unity'nin örnek koduna bir göz atın. 2D Oynanış Eğitimi .

Kod, Karakter Kontrolörünü kullanarak hareketli platformlar, düşmanlar ve çarpışma içeren kutularla eksiksiz bir 2D oyun oynar.

Ama bir göz atmak bile istemiyorsanız, fizik kullanımını en aza indirmenizi ve davranışını kendi kodunuzla kopyalamaya çalışmanızı öneririm. Ne tür bir 2D oyun planladığınıza bağlı olarak oldukça iyi çalışabilir. Örneğin, Rigidbody.velocitykarakterinizi doğrudan hareket ettirmek için kuvvet uygulamak yerine Transform.Translate()nesneyi Transform.positioneksenine göre hareket ettirebilirsiniz. Sen belirleyebilir forwardve backnesnenin kendisi ya da belki platforma ya da yere ilişkinTransform.up , bu yüzden bir rampa olup olmadığını ve türünün açısını bildiğini bileceksiniz.

Ayrıca, bir tür hız kontrolü atributte oluşturursanız (örneğin, tuşa ne kadar basılı tutulursa), karakterinizin Sonic the Hedgehog'da yaptığı gibi, çok hızlı eğimli bir şekilde yürümesini önlemek için çevirirken yönünüzle birlikte uygulayabilirsiniz. Genesis / Mega Drive için.

Eğer fizik kullanmaya devam etmeyi seçerseniz, size hiç yardım edemem çünkü o kadar iyi değilim, ama vücudun yetişmek için daha fazla güce ihtiyacı olduğu için 'eğime' daha yavaş gitmenin normal bir davranış olduğunun farkında olun , gerçek hayat gibi.


Birliğe girdiğimde okuduğum ilk şey bu öğreticiydi. Sorun, kontrol hissinin oldukça kötü olmasıdır. Bu yüzden kendi çözümümü bulmak istedim. Öte yandan, Transform.Translate () yöntemini kullanmaya başladığınızda eğimler ve diğer şeyler yapmak o kadar kolay değildir. Birkaç kez ışın atmanız gerekir (zemin için 2 veya 3, kahraman boyutuna bağlı olarak hareket ettiğiniz yön için daha fazla). Mobil cihazlar için raycast iyi değildir ve çarpışma algılama yinelemesi başına 5..n yapmanız gerekiyorsa daha azdır. Belki yanılmış olabilirim, ama öyle düşünmüyorum.
Notbad

1

Ne istiyorsun yerleşik Karakter Kontrolörü . step offsetBu bileşen üzerindeki özelliği ayarlayarak bir oyuncunun yamaçları kolaylıkla aşağı ve yukarı hareket ettirmesini sağlayabilirsiniz.


Yorumda bulunmadığım için üzgünüm Birlik içinde bir Karakter Kontrolörü olduğunu biliyordum ve birkaç kez kullandım, ama nasıl davrandığını sevmiyorum. Hareket mekaniğinin en önemli şeylerden biri olduğu bir platform oyunu değil, sadece FPS için daha uygundur.
Notbad

Bence Karakter Kontrolörü'ndeki ayarlarla uğraşırsanız iyi çalışır. Ne eksik buldun?
NoobsArePeople2

Sevmediğim ilk şey, bazı ışın dökümü ile normal rijit gövdelere göre yavaş olmasıdır. Bunu nasıl başaracağımı bilerek, daha hafif bir kontrolör yapabileceğimi düşünüyorum. Başka bir problem, platform kenarlarında bir kapsül / küre tuhaf davranışıdır (daha fazla ışın dökümü ile çözülebilir). Bu yüzden kendimi devirmek istiyorum.
Notbad

0

resim açıklamasını buraya girinSanırım bunun nedeni kuvvetin platforma paralel olmaması ve sonucun yükselişte ve inişte daha yüksek olmasıdır.

Koordinat sistemine göreli bir kuvvet uygularsanız

AddRelativeForce

Maksimum hızı "x" olarak tutmak ve bir skalerle karşılaştırmak, hızın bir vektör olduğunu ve vx ve vy oluşturduğunu unutmayın, düz arazide vy sıfırdır, ancak mutlaka eğimlerde sıfırdan büyüktür.

Hız vücudun yönüne göre değişir ve bağıl vx toplam vx'e göre değişir.

Bu, V'nizi de istemediğiniz şekilde değiştirebilir:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

aynı global Vx'i korumak göze garip gelebilir. (İstenmeyen Hızlanmalar)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.