OnSerializeNetworkView есть в моей игре Unity 2D

1

У меня есть 2 скрипта:

  • Сетевой менеджер
  • PlayerScript

и GameObject Player: Изображение 174551 для сети управления У меня есть GameObject Сценарии: Изображение 174551 Код игрока:

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
    Если вы собираетесь выбросить кучу скриншотов и столько кода в вашем вопросе, я бы предложил поместить введение в вашу проблему и ваш вопрос вверху. Таким образом, люди знают, что они на самом деле ищут, прокручивая код (который действительно следует уменьшить, если вы можете).
Теги:
unity3d
networking
2d
rpc

1 ответ

2
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню