Unity 版本: 5.5
场景示例:
- 灯光 [一个带有 Light 组件的 GameObject]
- 灯开关 - [包含: BoxCollider|NetworkIdentity|从 NetworkBehaviour 继承的脚本,在点击其 BoxCollider 时切换灯光的开关状态]
LightSwitch.cs
public class LightSwitch : NetworkBehaviour
{
public GameObject roomLight;
void OnMouseDown () {
CmdToggleLight(!roomLight.activeSelf);
}
[Command]
void CmdToggleLight (bool status) {
RpcToggleLight(status);
}
[ClientRpc]
void RpcToggleLight (bool status) {
roomLight.SetActive(status);
}
}
我该如何让任何玩家点击那个开关,从而切换灯的开/关状态呢?
编辑: 参考这个示例,这是我需要构建的代码:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class LightSwitch : NetworkBehaviour
{
public GameObject roomLight;
[SyncVar(hook="setLight")]
private bool status;
void OnMouseDown()
{
// my player's singleton
Player.singleton.CmdToggleSwitch(this.gameObject);
}
public void toggleLight()
{
status = !status;
}
void setLight(bool newStatus)
{
roomLight.SetActive(newStatus);
}
[ClientRpc]
public void RpcToggleSwitch(GameObject switchObject)
{
switchObject.GetComponent<LightSwitch>().toggleLight();
}
}
Player.cs 代码:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;
using System;
public class Player : NetworkBehaviour {
public static Player singleton;
void Start () {
singleton = this;
}
//... my player class code ....//
[Command]
public void CmdToggleSwitch(GameObject gObject)
{
gObject.GetComponent<LightSwitch>().RpcToggleSwitch(gObject);
}
}
一个简单的灯光切换,却需要一个巨大的翔,感谢Unity。
CmdToggleSwitch
放置在同一GameObject中,因为该脚本附加在NetworkIdentity所在的GameObject上。