18、分组的管理
新建游戏管理对象
新建GameManager.cs,添加如下代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class GameManager : NetworkBehaviour
{
private static GameManager instance; // 创建单例模式
public static GameManager GetInstance()
{
return instance;
}
public Team[] teams;
private void Awake()
{
instance = this;
}
}
[System.Serializable]
public class Team
{
public string name; // 组名
public Material material; // 组的材质
public Transform spawn; // 角色生成的地点
public Color color; // 颜色
}
创建四种颜色的材质
新建四种颜色分别代表的生成地点
将材质和生成地点对象添加到GameManager中
由于坦克生成地点会和这些地形碰撞,所以需要把它们分别设置在不同的图层
在物理引擎中设置一下,两个图层的物理效果失效
如此,当坦克生成在cube地形上,可以不触发碰撞
19、创建角色旗帜
将Pole和Flag的box collider组件移除,因为是通过两个cube捏成一个旗帜,不需要碰撞组件
20、组的分配
在Player.cs更新代码
using System;
using UnityEngine;
using Mirror;
public class Player : NetworkBehaviour
{
……
[HideInInspector]
[SyncVar]
public int teamIndex; //同步到客户端
……
public override void OnStartClient()
{
Team team = GameManager.GetInstance().teams[teamIndex];
for (int i = 0; i < renderers.Length; i++) // 遍历所有需要渲染的对象,即杆子和旗面
{
renderers[i].material = team.material;
}
}
……
}
将对象添加Meshrenderer里
在GameManager.cs更新代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using Random = UnityEngine.Random;
public class GameManager : NetworkBehaviour
{
……
// 将每个组的数量封装成列表List,同时设置成SyncList,实现可以服务器到客户端的同步传输
public SyncList<int> size = new SyncList<int>();
……
// 每个组的数量初始化为0
public override void OnStartServer()
{
if (size.Count != teams.Length)
{
for (int i = 0; i < teams.Length; ++i)
{
size.Add(0);
}
}
}
// 得到四个组中组中数量最小的组
public int GetTeamFill()
{
int teamNo = 0;
int min = size[0];
for (int i = 0; i < teams.Length; ++i)
{
if (size[i] < min)
{
min = size[i];
teamNo = i;
}
}
return teamNo;
}
// 实现随机生成在生成地(cube),并生成的角色互相不碰撞
public Vector3 GetSpawnPosition(int teamIndex)
{
return teams[teamIndex].spawn.position;
}
}
……
由于角色是mirror生成的,因此生成地点和对应的组类别没有设置,所以需要自定义角色的生成,同时将teamindex传回去,先测试效果