leonscottkfm

Unreal MVP
31 May 2015
1,540
5
219
63
28
(34) İstanbul Avrupa
store.steampowered.com
Arkadaşlar 2 tane sorum olacak:

1-) Youtubede bayağı bir arattım fakat normal "BlendSpace" ile yapılmış yürüme koşma animasyonlarını ve AnimBP deki durumları nasıl Replication edeceğimi bulamadım.Anim montage vardı onu replication ettim. Fakat diğerlerini bulamadım.

2-)Diyelimki benim zıplayarak saldıran bir animasyonum var "ileri atılıp saldırıyor". Dolayısıyla karakteri de ileri atmam gerekiyor sanırım.Bunun için ne kullanmam gerekiyor? Karakterin hızını mı artırayım ? Launch mu edeyim? Yoksa yumuşak bir şekilde teleport mu edeyim ? Nedir bunun çözümü?

Teşekkürler...
 
1. Anım BP replicate edilemez. Bunun yerine mesela o blendspace in girdisi olan ve onu yöneten değişkeni yani speed i replicate edersin. Böylece hem serverda hem cĺient 'ta aynı blend space in aynı şekilde çalıştığını görürsün. ( Aslında bu örnekte speed replicate etmeyede gerek yok çünkü character movement component iki tarafta replicated olarak velocity yı güncellediği için gerek yok. Ama ben mantığı anlattım
2. Bu konuyu " Root motion" konusunu araştırarak anlayabilirsin. Ben özet olarak şöyle anlatayım. Karakterin root bone unun transformunu kapsüle uygulayarak istediğin elde edilmiş oluyor. Her şey otomatik. Her animasyonun sol alt tarafında bu seçeneği görebilirsin. Tam anlamak için biraz daha araştırma yapman gerekebilir
 
Tamamdır ben root motionu biliyorum onu enabled ettim ve hareket ediyor. Fakat ben daha ileri atılmasını istiyorsam mesela ne yapacağım ? Animasyondaki atılma yetersiz geldi.

Ayrıca 1.seçenek bende çalışmıyor. Kendi "server" kısmımda çalışıyor animasyonalar görünüyor fakat Clientlerde animasyonsuz hareket ediyorlar kendilerinde ise kasarak hareket ediyor "titreyerek"
 
Daha ileri gitmesini istiyorsan en basit yöntem şu. Additive animation. Sadece root bone u tut animasyon editöründe. Play başlığını animasyonun ortalarına ya da en ekstreme olduğu en ilerde olduğu yere getir. Sonra al o root bone u daha ileri istediğin yere kadar götür. Bu noktada üste artı işaretli bir button var. Ona tıklayarak yeni getirdiğin yeri "key" 'le. Sonra kaydet. Artık allta yeni bir curve görmen gerek. Animasyonu tekrar oynattığında istediğin yere kadar gittiğini göreceksin.
 En basiti bu. Diğer yöntem transform bone nodu ama o biraz daha karışık. Onu geçiyorum.
Diğer soru için ise değerleri kontrol etmen gerekir. Serverda herşey normalse eğer client ta replication problemi vardır. Bunu anım BP de görebilirsin. Örneğin blend space a gelen değişkene sağ tıklayıp watch this value dediğinde tekrar çalıştığında hangi değer geliyor bakmalısın. Normal durumlar da character movement component ta bu hususlar otomatik. Hiç bir sorun çıkmaması lazım. Ama anladığım kadarı ile sen değişik bir şey yapıyorsun. Cĺient hiç anime olmaması ona hiç değer gelmediğini gösteriyor. Client ile simulated proxy kastediyorsun sanırım. Kendileri derken autonomous proxy kastediyor olmalisin. Titreyerek olmasi değerlerin sadece serverdan gelmesi arada client prediction olmaması olabilir. Normalde her salise replication olmaz. Aradaki atlamalarda ondan kaynaklanıyor olabilir. Hiç animasyon olmaması ise ancak hiç değer gelmiyor olması gerekir başka türlü oluşamaz. 
Hiç bir şey görmeden ancak bu kadar yardım edebildim. Tahmin yürütüyorum sadece.
 
Şöyle göstereyim.

AnimalVariety pack var bende. Kurdun sağa sola dönmesi yürümesi ve koşması ile ilgili bir BlendSpace hazırladım. Daha sonra AnimBP de Speed (Vel) ve Rotasyon yönü (Dir) değişkenlerle bunları alıp BlendSpaceye aktardım. Char başta idle hıza ve yöne göre bu movement çalışıyor.


ROS dediğim şey Run On Server komutu. Client dediğimde tüm oyuncular için multicast edilmiş hali.


Aşağıdaki resme tıklayıp linke gidip resmi indir derseniz boyutu büyüyor.




Ayrıca Clientte max walk speed 9999 yapınca karakter uçuyor ama serverda ki karakterimde o hız değişmiyor. Sanırım değerleri blenspace üzerinden alıyor. Çünkü server kurmadan oynayınca da local de de değişmiyordu.



Fakat animasyonlar çalışmıyor. Montage çalışıyor sadece.
 
Öncelikle burası anim BP olduğu için burada kurduğun replication mantığı çalışmayacaktır. Epic games bu fonksiyonları orada açık bıraktığı için insanlar orada da replication yapılabileceğini düşünmektedir. Ben de geçmişte aynı yanılgıya düşmüştüm. Anım BP de kullandığın server ve client fonksiyonlarının hiç bir anlamı yoktur. Bu sistemi yani replication sistemini character de kurman gerekir. Anım BP nin tek bir görevi vardır. Bilgi çekerek animasyonu oynatmak. Bundan fazlasını yapamaz.
Ancak senin burda bu kurduğun sisteme gerek yok zaten. Çünkü ulaşmaya çalıştığın şeyler zaten yukarıda belirttiğim gibi otomatik hazır şeyler.
Dolayısı ile replication fonksiyonları direk kaldırman gerekiyor.
Ikinci olarak update animation kodu yani en yukarıdaki tick fonksiyonu dur. Yani eğer bu fonksiyonu eğer gitseydi saniyede binlerce kere server a gönderiyorsun. Bu direk networku off konuma getirirdi ve sistemi kullanılmaz hale getirirdi. Hiç bir zaman tick fonksiyonlarda server yada client fonksiyonları çalıştırmak istemezsin.
3 üncü olarak karakterden input vektörü çekiyorsun. Bu sadece autonomous proxy lerde yani birisinin direk kullandığı karakterlerde dolu olur. Diğer hepsinde boş olur. Yani sen pc nde senin elindeki karakterde doludur ancak senin pc nde diğer oyuncu karakter için boştur. Başkasının pc sinde senin karakterin için de boştur.
Sonuç olarak yapman gereken tüm replication fonksiyonları kalkacak. Tüm kodu update animation a bağlayacaksın. Orada da hızı input vektör den değil character movement component tan get velocity oradanda get size yaparak alacaksın. Direction olayı kullandığın kontrol durumuna göre değişir. Normal standart third persson kontrollerini kullanıyorsan karakter kendini velocity ye göre  otomatik döndürecektir.  Oynayana göre hangi yöne baktığını çekmek istiyorsun oda get kontrol rotation ile get forward vektörün cross product i ve dot product ı ile bulunuyor. Cross product sağa bakıyorsa -1 sola bakıyorsa 1 olacak. Dot product ise cepheye bakıyorsa 1 geri bakıyorsa   - 1 olacak. Bunu yaparken get control rotation replicated olmadığı için sorun çıkacaktır. Onu character de replicated hale getirip öyle kullanman gerekir.
Köpeğe benzer bir yaratığın tüm kodunu ben yazdığım için bilerek konuşuyorum. Biraz kılçıklıdır.
 
Pardon c++ ta size olduğu için yanlış söylemişim. Kusura bakma. BP de  Vector length oluyor. Şu an hızlanma mevzuu doğru gözüküyor. Print screen ile ekrana yazdırıp ne değerler dönüyor, blend space değer aralığına uyumlumu diye kontrol edebilirsin. Velocity değerini  blend space e girdi yapacaksın. Ekrana print screen ile çıkartarak doğru mu diye bakabilirsin.
Şimdi yukarıda ki  resme bir daha baktım. Speed aralığını blendspace 'te  -1 1 ver mişsin. Bu hıza zaten dokunduğunda ulaşacak hatta çok aşacaktır. Bu nedenle hemen son değere ulaşacaktır. Herşeyin bir biri ile uyumlu olması gerekir. Speed 0 ila 400 falan gibi bir rakam verebilirsin blend space te
Diğer hesaplar eğer direction içinde yanlış gibi duruyor.
 
Videodaki adam öyle yapıyordu. Normalde ben de senin dediğin gibi yapıyorum. Şuan dediğin gibi 0-600 yaptım fakat karakter hiç ilerlememeye başladı bu seferde :D Seni de uğraştırıyorum ama bunun replication la alakası yok merak edip dediğin gibi yaptım dün localde. Fakat hareket etmiyordu şimdi de etmiyor o şekil yapınca.

Hareket kodlarım ThirdPerson ile aynı bu arada. Control rotation falan da aynı
 
Zaten önce single player olayını halletmen gerekir. Sonra replication halledilir. Dediğim gibi kontol ettin mi. Speed input kaç geliyor blend  space e. Sağ tıklayıp  watch dedinmi. Eğer speed in 0 400 arası geliyorsa mesela, senin blend space inde speed 0 400 aralığında ise çalışmama ihtimali yok. Ama speed değeri yanlış geliyorsa blend space in yapabileceği bir şey yok. Blend space i yanlış bir şeyle besliyor olmayasın. Blend space i beslediğin değişkeni sağ tıklayıp watch deyip debug ayarlandığında değerler kaç geliyor. Orayı gösterir mısın. Ayrıca bpde vectorlength ten sonra print screen yaptığında normal değerler geliyormu. Sonuçta bu basit matematik. Doğru değerler geliyorsa çalışmama ihtimali sıfır.
 
Senin tüm sistem birbirine karıştı galiba. Sıfırdan başlasan daha iyi olacak. Büyük ihtimalle anim graph ta da hatalar vardır eminim. En basitten başlarsan daha iyi olur.
 
Benim anladığım tek bir şey var.Hiçbir şekilde Charachter movementtaki velocity değerini baz almıyor. Alırsa W ye bastığım halde hız 0,008 falan oluyor oysaki max walk speedim 9999.
Ancak kendim bir değişken oluşturup onu max walk speedle eşleyip daha sonra animbp deki velocity yerine o değişkeni yazarsam o zaman çalışıyor.

Animasyon hızına göre çalışıyor karakterin hızı. Mesela animasyon root motion olduğu için play ratesini artırırsam koşu hızı değeri ona göre şekileniyor.Yani max walk speed devreden çıkmış oluyor. Neden öyle anlamadım ama böyle bir sorun var ilginç şekilde.Tamamen animasyonun hızına bağlı karakterin hızı.Animasyonda başta 0 olduğu için karakter hareket edemiyor ancak rateyi artırırsam hızlanıyor.
 
Root motion dan çıkar  o zaman. Altta fix diye bir şey var onu aç onun yerine. Yada tamamen kapalı başla. Şu an sistemin tamamen karışmış galiba. Olmazsa gün içerisinde discordan bağlanayım bakayım.
 
Problemi çözdüm :D Root motion everything diye bir şey var animbp de ağzına ettiğimin şeyi ya. Tüm animasyonlara root motion uyguladığı için hızı falan görmezden geliyormuş o yüzden. Adamın yaptığı şeye göre mantıklı. Çünkü adamın yaptığı kurt belli bir hıza sayip ve dönüşlü hareket edecek ama bu bende sorun teşkil etti.Hız değişikliği yapmama Replication yapmama vs engel oluyor bu.

Ama bu seferde istediğim sonucu alamıyorum. Tam animasyona bağlı değişmiyor hareketler
 
Ben anladım olayı.Sistem bize uygun değil. Videoyu izler misin?

Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.


32. dakkaya dikkat et. Adam root motion hızını baz aldığı için last input kullanmak zorunda (bu yüzden biz replication edemiyor ve kullanamıyoruz) Aynı şekilde root motion hızını baz aldığımız için de movement hızı veremiyoruz animasyon hızı max ne kadar ise onu alıyor. Her şeyi root motion yapmaz isek animasyon bozuluyor. Adamda 0-1 arasında hız değeri tanımış.Bunu da kendi add move inputu ile yapmış ve shifte basınca 1 bırakınca 0.75 e düşüyor hızı.Fakat asıl konu bu nasıl Replication şekilde çalışacak ona nasıl çevireceğiz.Şuan adamda çalışan ne varsa aynısı bende var.
 
Videoyu izledim. Adamın tüm sistem single player a göre. Bir kere root motion from everything multiplayer uygun değil diyor epic games. O ayarda görebilirsin. Sistem burada çöküyor. Ayrıca client larda movement input ta yok. Orda ikinci darbe oluyor.
Denemedim ama muhtemelen çok sorun çıkacaktır multiplayer a çevirirsen. 
Şöyleki yerel movement vektörü server a gönderip oradan tüm cĺient lara replicate edeceksin. Bunuda karakter de yapacaksın. Ama daha önce anlattığım gibi bu öyle tick kadar hızlı olmayacak ve sıçramalar olacaktır. Bunun da yöntemi var tabii ki. Client prediction. Ama o konu burayı aşar. 
Daha kolay yöntem buradan öğrendiklerinle multiplayer a uygun yeni bir sistem kurmak.