Hello!
So I’ll get straight to the point, my goal for script is for the client to try and change its spriteID, send the request to the server which then changes the actual spriteID. Then. through OnSerializeNetworkView I seek to update the sprite on all clients on the network.
The other example in OnSerializeNetworkView shares the updated transform to all clients when a client has moved and is working as intended, BUT.
My question is, why doesn’t the second example dealing with sprite updates not work properly?
The server changes the sprite, but all OnSerializeNetworkView seems to do in terms of updating the clients is to update the spriteID on the NetworkPlayer who sent the request exclusively and not to everybody else. What is the source and the solution of this issue?
Thank you in advance.
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
if(stream.isWriting)
{
print("Is Writing" + info.sender + info.networkView);
Vector3 pos = transform.position;
stream.Serialize (ref pos);
int id = 0;
id = sprite.spriteId;
stream.Serialize(ref id);
}
else if(stream.isReading)
{
print("Is Receiving");
Vector3 posReceive = Vector3.zero;
stream.Serialize(ref posReceive);
transform.position = Vector3.Lerp (transform.position, posReceive, 0.9f);
int idReceive = 0;
stream.Serialize(ref idReceive);
sprite.spriteId = idReceive;
}
}
}
Here’s the full script:
using UnityEngine;
using System.Collections;
public class playerMoveAuthoritative : MonoBehaviour
{
public NetworkPlayer theOwner;
float lastClientHInput = 0f;
float lastClientVInput = 0f;
Vector2 lastClientInput = Vector2.zero;
float serverCurrentHInput = 0f;
float serverCurrentVInput = 0f;
tk2dBaseSprite sprite;
Vector3 moveDirection = Vector3.zero;
int clientSpriteID = 0;
int serverSpriteID = 0;
NetworkViewID viewID;
void Start()
{
sprite = GetComponent<tk2dBaseSprite>();
}
void Awake()
{
if (Network.isClient)
enabled = false;
}
[RPC]
void SetPlayer(NetworkPlayer player)
{
theOwner = player;
if(player == Network.player)
enabled = true;
}
void Update()
{
viewID = Network.AllocateViewID();
if(theOwner != null Network.player == theOwner)
{
float HInput = Input.GetAxis ("Horizontal");
float VInput = Input.GetAxis ("Vertical");
if(Input.GetKeyDown (KeyCode.A))
{
clientSpriteID = 3;
}
if(Input.GetKeyDown (KeyCode.S))
{
clientSpriteID = 2;
}
if(Input.GetKeyDown (KeyCode.D))
{
clientSpriteID = 1;
}
if(Input.GetKeyDown (KeyCode.W))
{
clientSpriteID = 0;
}
if(lastClientHInput != HInput || lastClientVInput != VInput)
{
lastClientHInput = HInput;
lastClientVInput = VInput;
if(Network.isServer)
{
SendMovementInput(HInput, VInput);
SendPlayerOrientation(viewID, clientSpriteID);
}
else if(Network.isClient)
{
networkView.RPC ("SendMovementInput", RPCMode.Server, HInput, VInput);
networkView.RPC ("SendPlayerOrientation", RPCMode.Server, viewID, clientSpriteID);
}
}
}
if(Network.isServer)
{
moveDirection = new Vector3(serverCurrentHInput, serverCurrentVInput, 0);
float speed = 3f;
transform.Translate (speed * moveDirection * Time.deltaTime);
sprite.spriteId = serverSpriteID;
}
}
[RPC]
void SendPlayerOrientation(NetworkViewID viewID, int clientSpriteID)
{
serverSpriteID = clientSpriteID;
}
[RPC]
void SendMovementInput(float HInput, float VInput)
{
serverCurrentHInput = HInput;
serverCurrentVInput = VInput;
}
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
if(stream.isWriting)
{
print("Is Writing" + info.sender + info.networkView);
Vector3 pos = transform.position;
stream.Serialize (ref pos);
int id = 0;
id = sprite.spriteId;
stream.Serialize(ref id);
}
else if(stream.isReading)
{
print("Is Receiving");
Vector3 posReceive = Vector3.zero;
stream.Serialize(ref posReceive);
transform.position = Vector3.Lerp (transform.position, posReceive, 0.9f);
int idReceive = 0;
stream.Serialize(ref idReceive);
sprite.spriteId = idReceive;
}
}
}