Mirror初体验

:bookmark:快速食用

在场景中创建一个空物体,并挂载如下几个脚本。

网络管理器

其中,需要指定Player Prefab,勾选自动生成玩家可以在连接到服务器时,自动生成玩家对象。

image-20221010100103105

玩家

为玩家添加如下组件:

  • Network Identity 表示这是一个需要进行网络同步的物体。
  • NetWork Transform 表示可同步Transfrom

image-20221010100400624

PS:注意勾选认证,让玩家只能控制自己的物体

image-20221010100615058

玩家控制脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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}");
}
}

参考