Как отправить сценарий синхронизации по сети Photon Unity

У меня есть многопользовательская игра, в которой используется фонарик, и если я нажимаю L, фонарик выключается и в другой игре, но когда batteryTimeLeft достигает 20, он мигает только в локальной игре.

Как синхронизировать весь этот скрипт со всеми пользователями, чтобы мерцание тоже шло по сети?

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class LightManager : Photon.MonoBehaviour {
    public GameObject flashlight;
    public Light lightinflashlight;
    public bool Lightenabled = true;
    public float batteryTimeLeft = 100f;
    public float batteryDrainRate;
    public float minIntensity = 0.25f;
    public float maxIntensity = 8f;
    public bool flashlightRanOut = false;
    float random;
    float noise;
    public float time=3;
    void start(){
        PhotonView photonView = this.photonView;
        lightinflashlight = GetComponentInChildren<Light> ();
    }
    void Update () {
        photonView.RPC("publicUpdate", PhotonTargets.All); 
    }

    void FixedUpdate() {

        photonView.RPC("publicFixedUpdate", PhotonTargets.All); 

    }
    [PunRPC]
    public void publicFixedUpdate(){
        batteryTimeLeft -= batteryDrainRate;
        if (time < 0) {
            time = 0;
        } 
        time--;
    }
    [PunRPC]
    public void publicUpdate(){
        if (batteryTimeLeft >= 20) {
            flashlight.GetComponent<Light> ().intensity = 8;
            flashlightRanOut = false;
        }
        if (batteryTimeLeft < 0) {
            batteryTimeLeft = 0;
            flashlightRanOut=true;
        }
        if (!flashlightRanOut) {
            if (batteryTimeLeft <= 20) {
                if (time > 1) {
                    random = Random.Range (0.0f, 150.0f);
                    noise = Mathf.PerlinNoise (random, Time.time);
                    flashlight.GetComponent<Light> ().intensity = Mathf.Lerp (minIntensity, maxIntensity, noise);

                }
            }
            if (time < 0) {
                time = 3;
            }
            if (Input.GetKeyDown (KeyCode.L)) {
                Lightenabled = ! Lightenabled;
            }
            flashlight.SetActive (Lightenabled);
        } else {
            flashlight.SetActive (false);
        }
    }

}

person V3n0mou5    schedule 28.10.2015    source источник


Ответы (1)


Наиболее оптимизированное сетевое решение — это то, которое хорошо синхронизирует данные и имеет наименьшее количество передаваемых данных, просто отправьте по сети, если фонарик включен или выключен, и создайте таймеры на обоих клиентах, поэтому flashlightRanOut будет генерироваться независимо на обоих клиентах, шум также будет генерироваться на обоих клиентах, мерцание будет немного отличаться, поскольку оно использует случайные значения, но нет необходимости иметь абсолютно одинаковое мерцание (это также невозможно сделать, потому что задержка все портит).

person Neven Ignjic    schedule 28.10.2015
comment
но как мне это сделать? - person V3n0mou5; 29.10.2015