2017-03-29 66 views
0

我目前在嘗試更改多人遊戲中光線強度時遇到問題。更改光強度Unity多人遊戲

對於開始遊戲的人,主人來說,光強度變化很好。然而,連接到主機的人,其光強度不會改變。

我想改變使用[SyncVar]的光強度,但連接到主機的玩家根本看不到光強度的變化。這裏是我的代碼:

using UnityEngine; 
using System.Collections; 
using UnityEngine.Networking; 

public class dayNightCycle : NetworkBehaviour { //changes day and night based on the wavelevel SpawnManager_waveLevel.cs script 

    Light light; 
    float fadeTime = 1f; 
    [SyncVar(hook = "OnLightAmountChange")] 
    float lightAmout = 0f; 
    SpawnManager_waveLevel level; 

    public override void OnStartLocalPlayer() 
    { 
     light = GetComponentInChildren<Light>(); 
     level = GetComponent<SpawnManager_waveLevel>(); 
     light.intensity = lightAmout; 
    } 

    // Update is called once per frame 
    void Update() { 

     changeLight(); 
    } 

    void changeLight() 
    { 
     if (isLocalPlayer) 
     { 
      if (level.waveCounter == 1) 
      { 
       lightAmout = 0.03f; 
       light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime); 
      } 
      else 
      { 
       lightAmout = 1f; 
       light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime); 
      } 
     } 
    } 

    void OnLightAmountChange(float amount) 
    { 
     lightAmout = amount; 
     changeLight(); 
    } 
} 

我的問題是,光強度只會改變一個球員,主持人。我希望所有連接到遊戲的玩家都可以改變光線強度。歡迎任何建議。

回答

0

非常簡單的修復 - 如果'isLocalPlayer'爲false,您不會給腳本一個替代方案。

這裏有一個固定的光爲你改變:

void changeLight() 
{ 
    if (isLocalPlayer) 
    { 
     if (level.waveCounter == 1) 
     { 
      lightAmout = 0.03f; 
      light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime); 
     } 
     else 
     { 
      lightAmout = 1f; 
      light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime); 
     } 
    } 
    else{ 
     // If not a local player, simply update to the new light intensity. 
     light.intensity = Mathf.Lerp(light.intensity, lightAmout, fadeTime * Time.deltaTime); 
    } 
} 
+0

恐怕這不起作用,因爲我有一個OnStartLocalPlayer()方法,這意味着您編寫的else語句將無法找到燈光對象。 – arjwolf

0

我能夠完全從這個類去除光強度變化的邏輯來解決這個問題。該類現在看起來如下:

using UnityEngine; 
using System.Collections; 
using UnityEngine.Networking; 

public class dayNightCycle : NetworkBehaviour { //changes day and night based on the wavelevel SpawnManager_waveLevel.cs script 

    [SerializeField] 
    public Light light; 

    [SerializeField] 
    SpawnManager_waveLevel level; 

    [SyncVar(hook = "OnLightAmountChange")] 
    public float lightAmout = 0f; 

    public override void OnStartLocalPlayer() 
    { 
     OnLightAmountChange(lightAmout); 
    } 

    void OnLightAmountChange(float amount) 
    { 
     light.intensity = amount; 
    } 
} 

我已經先行一步,把改變光線強度到我SpawnManager_waveLevel的條件,現在它工作正常。我希望這能幫助那些和我面臨同樣問題的人。

哦,並且該類的一個很大的變化是在方法OnLightAmountChange(),我不再設置lightAmout = amount;我現在設置以下,你可以看到light.intensity = amount;實際的強度。