Oyun eylemlerini belirli animasyon zamanlamalarıyla senkronize etmek için iyi teknikler?


10

Bu yüzden üzerinde çalıştığım oyunda bir sorunla karşılaştım, ancak muhtemelen birçok oyunda ortaya çıkan oldukça temel bir şey gibi görünüyor.

Oyunum, bir karakter animasyonu sırasında bazı oyun işlevlerinin çok belirli bir zamanda gerçekleşmesini gerektiriyor. Ve böylece, başlığın dediği gibi, oyunla ilgili olayları / işlevleri / eylemleri bir karakterin animasyonundaki belirli noktalara senkronize etmek için bazı iyi tekniklerin ve temel stratejilerin neler olduğunu merak ediyorum.

Çeşitli oyun türlerinde bahsettiğim şeylerden bazı basit örnekler:

  • Karakteriniz atıcıya silahlarını yeniden yükler . Karakteriniz 'yeniden yükleme' animasyonunu oynatır, ancak currentAmmo değişkenini ayarlayan işlevin yalnızca dergi takas edildikten ve tabanca tıkandıktan hemen sonra çağrılması önemlidir . Bu, yeniden yükleme animasyonunun ortasında bir nokta olabilir.

  • Bir de sıra tabanlı RPG sizin karakter düşman bir çizgi bakan bir kuyruğa gir. Saldırı komutu verildiğinde, karakterlerinizden biri düşmanlardan birine koşar / atlar ve ayakta durmalarına / atlamalarına başlamadan önce dev kılıçlarını keser. Düşmanın, eğik çizgi animasyonunun oynandığı anda hasar gördüğünden emin olmak istiyorsunuz - koşma ve koşma arasında bir nokta.

  • Bir de gizli oyun , karakterin gizlice olabilir ve dünyada bilgisayar ve düğmelerle etkileşim. Belki de sızmakta olduğunuz karakolun ışıklarına giden güç kaynağını kapatan bir düğme vardır. Eylem düğmesine basıldığında, karakteriniz uzanır ve düğmeye basar ve ardından bekleme konumuna geri döner. Düğmeye basıldığında ışıkların 'push_button' animasyonunda tam olarak kapanmasını istiyorsunuz.

Kuşkusuz, benim özel durumum en çok ikinci örneğe benziyor, burada sıra tabanlı karakterin bir saldırı sırasında öne doğru eğildiği ve animasyonun temas ettiği kesin anda hasarın uygulanmasını istiyorum. . Çünkü benim sıra tabanlı bir sistem kullanarak oyunum (Final Fantasy veya Fire Emblem gibi bir şey hayal edin) hasar / şifa / büyü / vb istiyorum. Çarpışma / isabet kutuları kullanmama rağmen her karakter animasyonu sırasında doğru zamanda uygulanacak.

Ben popüler bir oyun motoru oyunumu yapıyorum ve şu an onların animasyon kullanarak bu hallediyorum bahsetmeliyiz olayları veya bildirebilmesi istenilen sonuçlara şey yakın ulaşmak için - karakterim gerçekleştirdiği belli komuta ve tetikleyiciler a komuta özel animasyon (yani: 'saldırı_komutu') ve komutlarımın her biri için animasyon öğeleri karakterleri ExecuteCommand işlevine bir animasyon olayı / 'geri arama' bildirmelidir. Başka bir deyişle - karakter, saldırı animasyonuna oynatılmasını söyler ve ardından saldırı animasyonu, animasyon sırasında hasarın dağıtılması gereken anda tam bir olay / karaktere geri arama bildirir.

Dürüst olmak gerekirse, bu şimdilik işe yarıyor, ama yanlış geliyor - buradaki büyük resmin bir kısmını kaçırmışım gibi! Bu yöntemin yanlış hissetmesinin bir nedeni, oyun mantığını animasyon varlıklarıyla birleştirmesidir; animation öğem bir ExecuteCommand () olayı / geri çağrısı eklemeyi unutursa, komut düzgün bir şekilde yürütülmez ve bir komut animasyonu komutu yürütmeden bitip bitmediğini kontrol etmek için ekstra kod gerekir. Dağınık ve oyunumun varlıklarına garip bir bağımlılığı olduğu anlamına geliyor. Tabii ki, saldırı animasyonu sırasında hasarın belirli bir noktada meydana gelmesini istiyorum, ancak animasyon varlıklarının içinde oyun kodunu çağırmaktan gerçekten garip hissediyorum.

Peki buraya ne bakıyorum? Animasyonlar sırasında belirli zamanlarda belirli oyun oynama eylemlerinin gerçekleşmesini istediğiniz bu tür durumları ele almak için bazı iyi genel teknikler nelerdir?

Düzenleme: Açıklığa kavuşturmak için, bu motora özgü bir soru değil, ben de motora özgü tasarımlar / teknikler arıyorum. Kullanılan teknolojilere bakılmaksızın oyun projelerinizde kullanabileceğiniz genel animasyon / oyun senkronizasyon teknikleri ile ilgileniyorum.


1
Kafam karıştı. Oynanışın animasyon zamanlamalarına bağlı olmasını istediğinizi söylüyorsunuz, ancak oyununuzun varlıklarınıza bağlı olmasını istemediğinizi ve animasyonların bir tür varlık olduğunu söylüyorsunuz. Bu isteklerin uyumlu olmasını nasıl bekliyorsunuz?
Anko

Bazı oyun öğelerinin animasyonla senkronize edilmesini istiyorum. Ancak, iki şey arasındaki senkronizasyon her zaman bir bağımlılık anlamına gelmez, değil mi? İnsanların animasyonlarını oyunlarıyla senkronize etmek için kullandıkları bazı tekniklerle ilgileniyorum. Bunu denemek için ne denediğimi ve şu anda ne yaptığımı söyledim - ve sorum şu ki, birinin kullanabileceği farklı / daha iyi / alternatif bir teknik var mı veya bu (animasyon olayları / bildirimler / varlıklar) standart yol? Projelerinizde kullandığınız bu mu?
MrKatSwordfish

Yanıtlar:


5

Senkronizasyon için, zamanlama otoritesinin kim olduğuna (kodunuz, animasyonlarınız ya da hiçbiri) karar vermeniz gerekir - diğer herkesin "dans ettiği" "dövmek".

Farklı düzenlemeler farklı oyunlara uygundur:

  • Animasyonlar zamanlama otoritesidir (mevcut kurulumunuz)

    Oyun kodu animasyonları tetikleyebilir. Animasyonlar belirli noktalara ulaştığında, oyun kodunun tepki gösterebileceği olayları (örn. Yeniden yükleme yapıldı) ortaya çıkarır (örneğin mevcut cephaneyi sıfırla).

    Animasyonların kesin zamanlaması (oyun durumundan bağımsız olarak) oyununuzun önemli bir parçasıysa veya özellikle animatörlerinizin zamanlamayı kontrol etmesini istiyorsanız, bu yaklaşımı göz önünde bulundurun.

    Animasyon araçları Blender (3D) ve Omurga (2D), animatörün oyun kodunun abone olabileceği olayları tanımlamasına izin verir.

  • Kod zamanlama otoritesidir

    Yukarıdakilerin tersi: Oyun dünyasında meydana gelen olaylar (örneğin, silahlarını yeniden yüklemeyi seçen oyuncu), animasyonların çalıştırılmasına ve parametrelerin geçmesine neden olur (örneğin, yeniden yükleme tamamlanana kadar geçen süre). Her animasyon, görünüşünü değiştirmek için sağlanan parametreleri kullanır (örn. "Yeniden yüklenen parça" belirtildiğinde gerçekleşecek şekilde animasyonu uygun bir hızda çalıştırmak).

    Animasyonlar ayrıca oyun etkinliklerini dinliyor olabilir (örn. Oynatıcı yeniden yüklemeyi iptal eder veya oyuncu yeniden yüklenirken çömelir) ve görünümlerini buna göre değiştirir.

    Animasyonlarınız zamanlama konusunda esnek olabiliyorsa, oyununuz ağırlıklı olarak prosedürel olarak oluşturulmuş içeriğe dayanıyorsa veya özellikle programcılarınızın zamanlamayı kontrol etmesini istiyorsanız, bu yaklaşımı düşünün.

    Büyümenin karakter animasyonları büyük ölçüde bu şekilde yapılandırılmıştır: David Rosen bunu GDC 14 konuşmasında açıklar (özellikle Hareket ve Hareket Devam eden bölümlerine bakın).

  • Örtük zamanlama (dış yetki)

    Ritim oyunlarında veya zamanlamanın harici bir kaynaktan kontrol edildiği diğer durumlarda (ritim oyunlarında, müzik parçasının ritmi), bu gibi şeyleri modellemek mantıklı olabilir. Oyun kodu ve animasyonlar hem küresel bir zaman damgasını hem de oyun durumunu okuyabilir, ardından iletişim kurmadan buna göre davranabilir.

    Oyun durumunuz ve animasyonlarınız büyük ölçüde harici bir zamanlama otoritesine bağlıysa, bu yaklaşımı göz önünde bulundurun.

Elbette oyununuzdaki farklı sistemler için farklı yaklaşımlar kullanmak isteyebilirsiniz. (Örneğin, ritim oyunları genellikle şarkının ritmini harici bir otorite olarak kullanır, ancak animasyonlar, tutulan notların görünümünü iptal etmek veya değiştirmek için oyuncu etkileşim etkinliklerini dinler.)


0

Hemen hemen tüm hesaplama problemlerinin ek bir soyutlama katmanıyla çözülebildiğini okudum ve davanızın farklı olduğunu görmüyorum.

Bu gereksinim için genellikle karakterin durumunu kontrol etmek için bir katman görüyorum. Bu şekilde karakterin geçerli bir Animasyonu ve geçerli bir Durumu olacaktır. Her birinin kendi sorumluluğu vardır.

Animasyon sadece görselden sorumludur ve devlet bu eylem için oyuna özgü mantığı işler.

Dövüş oyunumda durum, BaseState sınıfından miras alan ve bir Update () yöntemine sahip bir nesnedir. Her karakterin bir durum koleksiyonu vardır, ancak aynı anda yalnızca bir tane atanabilir. Ve mevcut durumun Update () yöntemi çerçeve başına bir kez çağrılır.

Tüm bu mantığı yaptığım durumun Güncellemesi () içinde: karakterin hızını belirli bir karede, artış / azalma sağlığı vb.

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.