leonscottkfm

Unreal MVP
31 May 2015
1,540
5
219
63
28
(34) İstanbul Avrupa
store.steampowered.com
Daha önce bununla ilgili çok konu açıldı fakat bu yöntem biraz farklı.

Benim oyunumda normal bir karakter var , fakat bu karakter domuza dönüşebiliyor. Oyunum online bir oyun.

Domuza dönüşme olayını karakter içerisinde yaptım replicate ettim ve her oyuncu da görünüyor. Fakat bu yöntem yanlış geldi bana , çünkü birden fazla karakter olacak ve her karakterin içine domuza dönüşme kodu mu gireceğiz ?

"G" tuşu ile domuza dönüşülüyor şuanda test için. Ben de genel olarak karakter koşması , yürümesi , ESC menüsü gibi tuşları PlayerControllere koydum.
Domuz da , Karakter de aynı player controlleri kullanıyor "HorrorPC" ismi.

Fakat şöyle bir durum oldu bu sefer de : Karakter G basarsa player controller "0" dönüşüyor. Yani Own karakterini alamıyor. Kendi karakterini alsın kendi dönüşsün istiyorum.
Sanırım bu kodu playercontroller içerisinde yaptığım için yine yanlış yoldayım. Bunu PlayerState içerisinde yapıp "G" tuşu ile PlayerControllerden mi çağırmam gerekiyor ?
 
Bir PlayerController ancak bir tane Pawn "possess" yapar. Yani ancak bir karaktere sahip olabilir. Bunu GameMode dan kontrol edersin. Hangi karakterin ana karakter olarak atandığına bakarak hangi karakterin şu an oyuna girdiğinde senin kontrolüne verileceğine bakabilirsin. Peki oyunda başka başka pawn lar varsa ne olacak? Cevap: Sen ancak aynı anda doğrudan sadece bir tane Pawn kontrol edebilirsin. Bir playercontroller için ikinci bir Pawn yoktur. ( Dikkat: Tüm characterler aynı zananda birer pawn dırlar.)
   Peki ne yapılabilir: Oyun türüne göre bir kaç değişik yöntem izlenebilir. Oyunun nasıl olduğunu bilmediğim için yöntemleri senin tercih etmen gerekecek.
     1. PlayerController her zaman bir pawn ı kontrol edebilir ama bu karakter her zaman değiştirilebilir. Bunun için Possess ve UnPossess komutları var playercontroller larda. Bu node lara istediğin bir pawnı gösterirsen onu direk sahiplenecek ve onu yönetmeye başlayacaktır. Oyun türü buna uygunsa bu yöntem izlenebilir.
     2. PlayerController ın sahip olduğu karakteri bir dummy (yani kukla) karakter yapabilirsin. Bu RTS, futbol vb. oyunlarda çok sık başvurulan bir yöntemdir. Buna göre dummy karakterin sadece olması gerektiği için vardır. Hiç bir şekilde görülmez ve collision olmaz. Tüm diğer pawnlar dolaylı olarak referansları alınarak kontrol edilir. Mesela mouse un tıklandığında altında bulunan pawn ı game mode da ya da playercontrollerda "Seçilmiş Karakter" (SelectedPawn) şeklinde bir değişkene kaydedip ondan sonra vereceğin komutların ona gitmesini sağlayabilirsin.
     3. Duruma bağlı olarak yukarıdaki iki metodun hibrit şekli de tercih edilebilir. Yani PlayerController ın direk sahip olduğu bir Pawn vardır ama aynı zaman selectedPawn da vardır ve bu ikisine gerektiği gibi komutları ya da talimatları gönderebilirsin.
   Her karakterin dönüşecek olması nedeni ile dönüştürme kodunu bir BaseClass ta yapmalısın. Yani pawn da ya da character den bir "ShapeShifterBase" ( yani ŞekilDeğiştiren) gibi bir base taban class yapıp, şekil değiştirmesi gereken tüm varlıkları bu classtan türetmelisin. Tüm şekil değiştirme fonksiyonları base class ta olmalı. Ondan drive edilen ortaya çıkarılan diğer herşey kendine ait fonsiyonlar icra edebilirler. Yani birisi domuza dönüşebiliryoken diğeri ayı ya das bir diğeri kaplana dönüşebilir. Ama Base deki şekil değiştirme kodu hep aynı kalır hepsi için.
 
Merhaba açıklama için teşekkürler ben şöyle bir şeysöyleyeyim.

Benim yaptığım kod yeni bir pawn yaratmıyor aslında. Varolan karakterin Mesh ve AnimationBP sini değiştiriyor.

Mesela Meshi domuza çevirip animasyon bp sini de domuz yapıyorum. Yani aslında görünürde değişiyor adam aynı karakteri oynatacak. Bu yöntem için ne yapmalıyım ?

Sadece mesh ve animbp si değişecek varolan karakter üzerinden. Ama bunu playercontrollerde yapınca adam G ye basarsa ID 0 dönüşüyor kendi dönüşmüyor. Local Id sını almam lazım yani demem lazım ki buna G basan playercontroller dönüşsün sadece. Ve diğerleri de bunu görsün.
 
Merhabalar. Multiplayerdan biraz uzak kaldım son zamanda ama oyunda ana oyuncu karakter kimse o PC 0 oluyor zaten. Dolayısı ile G tuşunun etki edeceği şey sadece kendi local characteri olacaktır. "Ama bunu playercontrollerde yapınca adam G ye basarsa ID 0 dönüşüyor kendi dönüşmüyor" Bu kısmı çok anladığımı sanmıyorum. Yapman gereken şey çok basit. Bir tane CustomEvent yapacaksın PC da, ve adı "ShapeShift" olsun. Bu şeyi RunOnServer yapacaksın ki local PC fonksiyonu kendi değil "server" a yaptırsın. Servera değişimi yaptırdıktan sonra replication sisteminden dolayı client larda bunu görecektir büyük ihtimalle. Eğer görmezlerse iki seçeneğin olur. 1. clientlarda ayrıca bu fonksiyonu çalıştırırsın. 2. Bir Netmulticast CustomEvent yapıp tüm clientlarda da gerçekleşmesini sağlarsın. Çok büyük ihtimalle buna gerek kalmayacak ve tüm clientların serverdaki değişimi algılayacaktır. 
(Not: PlayerController lara ulaşırken bir şeyleri karıştırıyor da olabilirsin)