# 🔖快速食用
在场景中创建一个空物体,并挂载如下几个脚本。
# 网络管理器
其中,需要指定 Player Prefab, 勾选自动生成玩家可以在连接到服务器时,自动生成玩家对象。
# 玩家
为玩家添加如下组件:
- Network Identity 表示这是一个需要进行网络同步的物体。
- NetWork Transform 表示可同步 Transfrom
PS: 注意勾选认证,让玩家只能控制自己的物体
using System; | |
using System.Collections; | |
using System.Collections.Generic; | |
using Mirror; | |
using UniRx; | |
using UnityEngine; | |
Qpublic class PlayerCtr : NetworkBehaviour | |
{ | |
[SerializeField] private float speed = 10; | |
[SyncVar(hook = nameof(OnColorChanged))] | |
private Color _color; | |
private MeshRenderer _renderer; | |
private void Awake() | |
{ | |
_renderer = GetComponent<MeshRenderer>(); | |
} | |
private void Start() | |
{ | |
if (isServer) | |
{ | |
RpcTest(); | |
} | |
Observable.EveryUpdate().Where(_ => isLocalPlayer && Input.GetKeyDown(KeyCode.Space)).Subscribe(_ => | |
{ | |
print("按下空格"); | |
var color = _color == Color.white ? Color.black : Color.white; | |
CmdChangeColor(color); | |
}); | |
//move | |
Observable.EveryUpdate().Where(_ => isLocalPlayer).Subscribe(_ => | |
{ | |
var h = Input.GetAxis("Horizontal"); | |
var v = Input.GetAxis("Vertical"); | |
if (Mathf.Abs(h) > 0.1f || Mathf.Abs(v) > 0.1f) | |
{ | |
var dir = new Vector3(h, 0, v).normalized; | |
transform.Translate(dir * speed * Time.deltaTime); | |
} | |
}); | |
} | |
private void OnColorChanged(Color oldColor, Color newColor) | |
{ | |
print("颜色变化"); | |
_renderer.material.color = newColor; | |
} | |
[Command] | |
private void CmdChangeColor(Color color) | |
{ | |
_color = color; | |
} | |
[ClientRpc] | |
private void RpcTest() | |
{ | |
// 在服务器端调用时,分别在客户端进行调用 | |
print($"当前客户端为:{this.netId}"); | |
} | |
} |
# 参考
- UnityMirror 学习笔记 (2):使用 SyncVar 进行数据同步_Cake_C 的博客 - CSDN 博客
- UnityMirror 学习笔记 (3):服务器与客户端间的函数调用,互发控制指令:Command,ClientRpc,TargetRpc_Cake_C 的博客 - CSDN 博客