Serverde scale vb. kordinasyonu?

      Serverde scale vb. kordinasyonu?

      Merhabalar, mobil platform için online bir fps oyunu yapmayı amaçlıyorum. Ancak bir sorunum var.
      Şiimdi karakterler birbirini görebiliyor yönlerini konumlarını filan. Ancak scale gibi değerleri takip edemiyor. Misal karakterlerin üzerinde can sprite leri var scale cinsinden azalıp artıyor ama bunlar diğer oyuncular tarafından takip edilemiyor. Yani A kişisi B kişisinin can barını azaltınca sadece kendisinde azalıyor. Ayrıca buna ek oyunda kukla tarzı öldürülcek şeyler var onlarında rotasyonları vb. yer değişiyor öldüklerinde ancak yine aynı az önceki örnekteki gibi sadece yapan kişi için değişiyor. Nasıl bir çözüm önerirsiniz?
      Bu konuda bana yardımcı olabilirseniz sevinirim :)
      Powered by Basay
      Senkronizasyon.
      Can barini UI Slider ile yapiyorsun tahminimce hangi Network sistemini kullandiginada bagli.uNet'e SyncVar olarak bir float tanimlayip ornegin:
      [SyncVar]public float currHealth;
      Sonra UI Slider'in value'sini currHealth / maxHealth esitlediginde senkronize olmus olur sadece float'u senkronize ederek yapabilirsin boylece herkeste gozukuyor olur.
      Kukla tarzi konusuna gelirsek client'in hangi pozisyonda ise onu server'a bildirip spawnlatmasi gerekiyor orda client'den spawnlatiyorsun tahminimce oyle oldugundada sadece yapanda gozukecektir.

      Shevy wrote:

      Senkronizasyon.
      Can barini UI Slider ile yapiyorsun tahminimce hangi Network sistemini kullandiginada bagli.uNet'e SyncVar olarak bir float tanimlayip ornegin:
      [SyncVar]public float currHealth;
      Sonra UI Slider'in value'sini currHealth / maxHealth esitlediginde senkronize olmus olur sadece float'u senkronize ederek yapabilirsin boylece herkeste gozukuyor olur.
      Kukla tarzi konusuna gelirsek client'in hangi pozisyonda ise onu server'a bildirip spawnlatmasi gerekiyor orda client'den spawnlatiyorsun tahminimce oyle oldugundada sadece yapanda gozukecektir.


      Haklı düzeltmen ve cevabın için teşekkür ederim, ilk başta senkronizasyon yazıp emin olamayarak değiştirmiştim öğrendiğim iyi oldu.
      Konuya gelecek olursak ne kullandığımdan emin değilim sanırım Unity Network. Ve healthlarıda karakterlerin üzerinde gezmeleri için ui değil sprite yaptım. Yardımınızı bekliyorum :)
      Powered by Basay
      Sprite'dan kastini tam anlamadim fakat UI ile Canvas'i World Space ayarladiginda daha rahat bir goruntu ve kolay bir bar olusturabilirsin.
      Nasil yapilacagina dair link:
      uNet tahminimce oyunun tipini nasil oldugunu bilmedigim icin mesela RPG ise kilic degdiginde karsidaki oyuncuya Server uzerinden bilgi akisi yapmak gerekir ornek yol olarak:
      Ilk islem olarak bunun yapilmasi gerekiyor.
      Player1'in Kilici Player2'ye degdi -> Collision'da Player2'nin netID'si alindi.
      Ikinci olarak:

      Source Code

      1. [Command]
      2. void CmdsendDamage(NetworkInstanceId theId,float damage){
      3. //Burdan direk ClientRPC'deki void'i cagirabilirsin eger server oyuncu olarak oynamiyacaksa yani bir dedicated tipi degilse.
      4. //Obur turlu burdada islem yapilmasi gerekiyor.
      5. //Ornek olarak Server'da oyuncu gibi oynayabilir sekilde gostereyim.
      6. NetworkIdentity[] ids = GameObject.FindObjectsOfType<NetworkIdentity> ();
      7. for(int x = 0;x < ids.Length;x++){
      8. if(ids[x].netID == theId){
      9. //Player health scriptinde takeDamage'de currHealth = currHealth - damage tipinde bir void olcak.
      10. ids[x].GetComponent<PlayerHealth>().takeDamage(damage);
      11. RpcsendDamage(theId,damage);
      12. }
      13. }
      14. }

      Source Code

      1. [ClientRpc]
      2. void RpcsendDamage(NetworkInstanceId theId,float damage){
      3. NetworkIdentity[] ids = GameObject.FindObjectsOfType<NetworkIdentity> ();
      4. for(int x = 0;x < ids.Length;x++){if(ids[x].netID == theId){
      5. //Player health scriptinde takeDamage'de currHealth = currHealth - damage tipinde bir void olcak.
      6. if(ids[x].netID == theId){
      7. ids[x].GetComponent<PlayerHealth>().takeDamage(damage);
      8. }
      9. }
      10. }

      Editor'den [SyncVar] olarak tanimladigin float taniminin degistigini goruceksin karsi oyuncunun.

      Shevy wrote:

      Sprite'dan kastini tam anlamadim fakat UI ile Canvas'i World Space ayarladiginda daha rahat bir goruntu ve kolay bir bar olusturabilirsin.
      Nasil yapilacagina dair link:
      uNet tahminimce oyunun tipini nasil oldugunu bilmedigim icin mesela RPG ise kilic degdiginde karsidaki oyuncuya Server uzerinden bilgi akisi yapmak gerekir ornek yol olarak:
      Ilk islem olarak bunun yapilmasi gerekiyor.
      Player1'in Kilici Player2'ye degdi -> Collision'da Player2'nin netID'si alindi.
      Ikinci olarak:

      Source Code

      1. [Command]
      2. void CmdsendDamage(NetworkInstanceId theId,float damage){
      3. //Burdan direk ClientRPC'deki void'i cagirabilirsin eger server oyuncu olarak oynamiyacaksa yani bir dedicated tipi degilse.
      4. //Obur turlu burdada islem yapilmasi gerekiyor.
      5. //Ornek olarak Server'da oyuncu gibi oynayabilir sekilde gostereyim.
      6. NetworkIdentity[] ids = GameObject.FindObjectsOfType<NetworkIdentity> ();
      7. for(int x = 0;x < ids.Length;x++){
      8. if(ids[x].netID == theId){
      9. //Player health scriptinde takeDamage'de currHealth = currHealth - damage tipinde bir void olcak.
      10. ids[x].GetComponent<PlayerHealth>().takeDamage(damage);
      11. RpcsendDamage(theId,damage);
      12. }
      13. }
      14. }

      Source Code

      1. [ClientRpc]
      2. void RpcsendDamage(NetworkInstanceId theId,float damage){
      3. NetworkIdentity[] ids = GameObject.FindObjectsOfType<NetworkIdentity> ();
      4. for(int x = 0;x < ids.Length;x++){if(ids[x].netID == theId){
      5. //Player health scriptinde takeDamage'de currHealth = currHealth - damage tipinde bir void olcak.
      6. if(ids[x].netID == theId){
      7. ids[x].GetComponent<PlayerHealth>().takeDamage(damage);
      8. }
      9. }
      10. }

      Editor'den [SyncVar] olarak tanimladigin float taniminin degistigini goruceksin karsi oyuncunun.


      Yardımınız için çok teşekkürler ancak paylaştığınız kodları ne yazık ki tam kavrayamadım. Yeterli bilgiye sahip olmamama dayandırıyorum bunu. Sizden ricam oyun için paylaşacağım kodlara bir göz atmanız ve bunlar için olabilecek birşey varsa bana bir yol gösteirminde bulunmanız, şimdiden teşekkürler :)

      Source Code

      1. using System.Collections;
      2. using System.Collections.Generic;
      3. using UnityEngine;
      4. using UnityStandardAssets.Characters.FirstPerson;
      5. public class GunFire : MonoBehaviour {
      6. public GameObject skor;
      7. float gunTimer;
      8. public float gunCooldown; //ates etme sıklıgı
      9. public Transform firePoint;
      10. RaycastHit rayHit;
      11. public GameObject bulletHole;
      12. //Recoil
      13. GunRecoil RecoilComponent;
      14. public float xMin, xMax, yMin, yMax, zKick;
      15. //Muzzle
      16. public GameObject MuzzleFlash;
      17. MuzzleFlash MuzzleFlashComponent;
      18. void Start () {
      19. RecoilComponent = GetComponent<GunRecoil>();
      20. MuzzleFlashComponent = MuzzleFlash.GetComponent<MuzzleFlash>();
      21. }
      22. void Update () {
      23. if(Input.GetButton("Fire1"))
      24. {
      25. if(Time.time > gunTimer)
      26. {
      27. if(Physics.Raycast(firePoint.position, firePoint.forward, out rayHit))
      28. {
      29. gunTimer = Time.time + gunCooldown;
      30. //BulletHole
      31. Vector3 bulletHolePos = rayHit.point + rayHit.normal * 0.01f;
      32. Quaternion bulletHoleRot = Quaternion.FromToRotation(-Vector3.forward, rayHit.normal);
      33. GameObject obj = Instantiate(bulletHole, bulletHolePos, bulletHoleRot) as GameObject;
      34. //Recoil
      35. RecoilComponent.Recoil(Random.Range(xMin, xMax), Random.Range(yMin, yMax), zKick);
      36. //Muzzle
      37. StartCoroutine(MuzzleFlashComponent.Muzzle());
      38. if (rayHit.transform.tag == "Oyuncu")
      39. {
      40. foreach (Transform child in rayHit.transform)
      41. {
      42. if (child.transform.gameObject.tag == "bar") {
      43. if (child.transform.localScale == new Vector3(0f, child.transform.localScale.y, child.transform.localScale.z))
      44. {
      45. child.transform.localScale = new Vector3(0f, child.transform.localScale.y, child.transform.localScale.z);
      46. rayHit.transform.rotation = Quaternion.Euler(90, 0, 45);
      47. rayHit.transform.gameObject.GetComponent<dead>().enabled = true;
      48. rayHit.transform.gameObject.GetComponent<RigidbodyFirstPersonController>().enabled = false;
      49. }
      50. else
      51. {
      52. foreach (Transform cano in child.transform)
      53. {
      54. canbari can;
      55. can = cano.transform.gameObject.GetComponent<canbari>();
      56. can.Health -= 100f;
      57. }
      58. }
      59. }
      60. }
      61. }
      62. }
      63. }
      64. }
      65. }
      66. }

      Bu silahın ateş etmesi için gereken kod, hedefte oluşan obje temas ettiği birimde mermi delği bırakıyor. Ve eğer çarpılan hedefte bir can barı varsa can barından eksiltiyor. Sanırım sadece vuruş olayını halledilebilirse sorun çözülecektir.

      Yardımcı olabilirseniz çok mutlu olurum :)
      Powered by Basay

      Bu seriyi izle derim cunku cani oyle azaltmak mantiksiz geldi bana.Mermiye Trigger ekleyip icine giren objenin Player oldugunu kontrol ettikten sonra onun NetworkIdentity'sinden netID'iyi alip Command ile server'a yolladiktan sonra diger oyunculara RPC ile yollarsin boyle performans bakimindanda kotu bir etki birakir.Birde using UnityEngine.Networking ile kutuphaneyi yukledikten sonra MonoBehaviour'u NetworkBehaviour yapman lazim ve Update'de

      Source Code

      1. if(!isLocalPlayer)
      2. return;

      Boyle yapmadiginda herkes ates ediyormus gibi sayiliyor.Video serisini incellediginde temelleri daha iyi anlarsin benim kodu duzeltip vermem bir katkida bulunmuyacak ilerisi icin ornek mermi kodu kendi orneklerinden unity'nin.
      docs.unity3d.com/Manual/UNetActions.html

      Shevy wrote:


      Bu seriyi izle derim cunku cani oyle azaltmak mantiksiz geldi bana.Mermiye Trigger ekleyip icine giren objenin Player oldugunu kontrol ettikten sonra onun NetworkIdentity'sinden netID'iyi alip Command ile server'a yolladiktan sonra diger oyunculara RPC ile yollarsin boyle performans bakimindanda kotu bir etki birakir.Birde using UnityEngine.Networking ile kutuphaneyi yukledikten sonra MonoBehaviour'u NetworkBehaviour yapman lazim ve Update'de

      Source Code

      1. if(!isLocalPlayer)
      2. return;

      Boyle yapmadiginda herkes ates ediyormus gibi sayiliyor.Video serisini incellediginde temelleri daha iyi anlarsin benim kodu duzeltip vermem bir katkida bulunmuyacak ilerisi icin ornek mermi kodu kendi orneklerinden unity'nin.
      docs.unity3d.com/Manual/UNetActions.html


      Yardımın için çok teşekkürler mutlaka inceleyeceğim
      Powered by Basay

      Shevy wrote:


      Bu seriyi izle derim cunku cani oyle azaltmak mantiksiz geldi bana.Mermiye Trigger ekleyip icine giren objenin Player oldugunu kontrol ettikten sonra onun NetworkIdentity'sinden netID'iyi alip Command ile server'a yolladiktan sonra diger oyunculara RPC ile yollarsin boyle performans bakimindanda kotu bir etki birakir.Birde using UnityEngine.Networking ile kutuphaneyi yukledikten sonra MonoBehaviour'u NetworkBehaviour yapman lazim ve Update'de

      Source Code

      1. if(!isLocalPlayer)
      2. return;

      Boyle yapmadiginda herkes ates ediyormus gibi sayiliyor.Video serisini incellediginde temelleri daha iyi anlarsin benim kodu duzeltip vermem bir katkida bulunmuyacak ilerisi icin ornek mermi kodu kendi orneklerinden unity'nin.
      docs.unity3d.com/Manual/UNetActions.html


      Birkez daha merhaba sizden bir konuda daha yardım isteyeceyim, bu online ateş etme olaylarını filan hallettim ancak birde oyuncunun seçeceği farklı karakterlerin oynanabilir olmasını istiyorum. Bunun için butonlar ve butonların tetikleyeceği boollar atadım ve tabii boollarda karakteri etkileyecekti. Pratikte ve singleplayer de herşey güzel çalışıyor, seçtiğim karakterle başlıyorum ancak iş online kısmına gelince işler bozuluyor. Her oyuncu kendi seçtiği karakter yerine odanın kurucusu hangi karakteri seçtiyse onunla başlıyor. Aslında sorunun çözümünü biliyorum, direk olarak kurulan odadaki NetworkManagere etki edilmesi lazım ancak bunuda ben yapamadım. Bu konudada bana yardımcı olabilirseniz çok mutlu olurum.

      Bu da kullandığım networkmanager

      Source Code

      1. using UnityEngine;
      2. using UnityEngine.Networking;
      3. using UnityEngine.Networking.NetworkSystem;
      4. public class MyManager : NetworkManager
      5. {
      6. [SerializeField] Vector3 playerSpawnPos;
      7. [SerializeField] GameObject character1;
      8. [SerializeField] GameObject character2;
      9. [SerializeField] GameObject character3;
      10. [SerializeField] GameObject character4;
      11. // etc.
      12. GameObject chosenCharacter; // character1, character2, etc.
      13. public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
      14. {
      15. if (karaktersecimi.a1 == true)
      16. {
      17. chosenCharacter = character1;
      18. }
      19. if (karaktersecimi.a2 == true)
      20. {
      21. chosenCharacter = character2;
      22. }
      23. if (karaktersecimi.a3 == true)
      24. {
      25. chosenCharacter = character3;
      26. }
      27. if (karaktersecimi.a4 == true)
      28. {
      29. chosenCharacter = character4;
      30. }
      31. var player = (GameObject)GameObject.Instantiate(chosenCharacter, playerSpawnPos, Quaternion.identity);
      32. NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
      33. }
      34. }
      Powered by Basay