2015-01-17 3 views
1

У меня есть 2 сценариев:OnSerializeNetworkView Issus в моем Unity 2D игры

  • NetworkManager
  • PlayerScript

и GameObject игрока: Player для сети управления я есть геймобжекты Сценарии: Scripts Код игрока:

using UnityEngine; 
using System.Collections; 

public class PlayerScript : MonoBehaviour { 

public float speed = 10f; 

private float lastSynchronizationTime = 0f; 
private float syncDelay = 0f; 
private float syncTime = 0f; 
private Vector3 syncStartPosition = Vector3.zero; 
private Vector3 syncEndPosition = Vector3.zero; 


private void InputMovement() 
{ 
    if (Input.GetKey(KeyCode.W)) 
     rigidbody2D.MovePosition(rigidbody2D.position + Vector2.up * speed * Time.deltaTime); 

    if (Input.GetKey(KeyCode.S)) 
     rigidbody2D.MovePosition(rigidbody2D.position - Vector2.up * speed * Time.deltaTime); 

    if (Input.GetKey(KeyCode.D)) 
     rigidbody2D.MovePosition(rigidbody2D.position + Vector2.right * speed * Time.deltaTime); 

    if (Input.GetKey(KeyCode.A)) 
     rigidbody2D.MovePosition(rigidbody2D.position - Vector2.right * speed * Time.deltaTime); 
} 

void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info) 
{ 
    Debug.Log("OnSerializeNetworkView!!!!!!!!!!!!!!!!!!!!"); 
    Vector3 syncPosition = Vector3.zero; 
    Vector3 syncVelocity = Vector3.zero; 
    if (stream.isWriting) 
    { 
     syncPosition = rigidbody2D.position; 
     stream.Serialize(ref syncPosition); 

     syncPosition = rigidbody2D.velocity; 
     stream.Serialize(ref syncVelocity); 
    } 
    else 
    { 
     stream.Serialize(ref syncPosition); 
     stream.Serialize(ref syncVelocity); 

     syncTime = 0f; 
     syncDelay = Time.time - lastSynchronizationTime; 
     lastSynchronizationTime = Time.time; 

     syncEndPosition = syncPosition + syncVelocity * syncDelay; 
     syncStartPosition = rigidbody2D.position; 
    } 
} 

void Awake() 
{ 
    lastSynchronizationTime = Time.time; 

} 

void Update() 
{ 
    if (networkView.isMine) 
    { 
     InputMovement(); 
    } 
    else 
    { 
     SyncedMovement(); 
    } 
} 

[RPC] 
private void SyncedMovement() 
{ 
    syncTime += Time.deltaTime; 

    rigidbody2D.position = Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime/syncDelay); 
    Debug.Log(syncStartPosition+ " ####### " +rigidbody2D.position+ " ####### " +syncEndPosition); 
} 

} 

и NetworkManager код:

using UnityEngine; 
using System.Collections; 

public class NetworkManager : MonoBehaviour { 

public Transform point1; 
public Transform point2; 

public GameObject player; 

// Use this for initialization 
void Start() { 
    if (Network.isServer) { 
     Network.Instantiate(player,point1.transform.position,Quaternion.identity,0);  
    } 
} 

void OnPlayerConnected (NetworkPlayer netPlayer) 
{ 
    Debug.Log("Player " + " connected from " + netPlayer.ipAddress + ":" + netPlayer.port); 
    networkView.RPC("net_DoSpawn",RPCMode.All); 
} 

[RPC] 
void net_DoSpawn() 
{ 
    Network.Instantiate(player,point2.transform.position,Quaternion.identity,0); 
} 
} 

Я много раз пытался для отладки идентификатора, но никаких изменений. OnSerializeNetworkView не вызывается, и игрок генерируется дважды. Если я пытаюсь перейти на позиции других игроков, они начинают мигать, иначе они не видны. Кто-нибудь может мне помочь? Большое спасибо и извините за мой английский :))

+1

Если вы собираетесь сбросить кучу скриншотов и много кода в своем вопросе, я бы предложил ввести введение в вашу проблему и ваш вопрос наверху. Таким образом, люди знают, что они действительно ищут, когда они просматривают код (который действительно должен быть уменьшен, если можно). – skrrgwasme

ответ

2

Вы должны наблюдать за сценарием, а не за трансформацию.

Перетащите компонент scrip в наблюдаемый слот. Затем он запустится.