英文原文:

https://mirror-networking.gitbook.io/docs/guides/gameobjects/custom-character-spawning

  许多游戏需要角色定制。您可能想要选择头发、眼睛、皮肤、身高、种族等的颜色。

  默认情况下,Mirror 将为您实例化Player。虽然这很方便,但它可能会阻止您对其进行自定义。 Mirror 提供了覆盖Player创建并对其进行自定义的选项。

  1. 如果您还没有这样做,请创建一个扩展 NetworkManager 的类。例如:
public class MMONetworkManager : NetworkManager
{...
}

并将其用作您的网络管理员。

  1. 在 inspector 中打开您的网络管理器并禁用“自动创建Player”布尔值。
  2. 创建一条描述您的Player的消息。例如:
public struct CreateMMOCharacterMessage : NetworkMessage
{public Race race;public string name;public Color hairColor;public Color eyeColor;
}public enum Race
{None,Elvish,Dwarvish,Human
}
  1. 创建您的Player预制件(根据需要创建多个)并将它们添加到网络管理器中的“Register Spawnable Prefabs”中,或者将单个预制件添加到检查器中的Player预制件字段中。
  2. 发送您的消息并注册玩家:
public class MMONetworkManager : NetworkManager
{public override void OnStartServer(){base.OnStartServer();NetworkServer.RegisterHandler<CreateMMOCharacterMessage>(OnCreateCharacter);}public override void OnClientConnect(){base.OnClientConnect();// 你可以在这里发送消息,或者你想要的任何其他地方CreateMMOCharacterMessage characterMessage = new CreateMMOCharacterMessage{race = Race.Elvish,name = "Joe Gaba Gaba",hairColor = Color.red,eyeColor = Color.green};NetworkClient.Send(characterMessage);}void OnCreateCharacter(NetworkConnection conn, CreateMMOCharacterMessage message){// PlayerPrefab是在Network Manager的 inspector 中指定的,// 但您可以在每个比赛中使用不同的预制件,例如GameObject gameobject = Instantiate(playerPrefab);// 应用消息中的数据,但要适合您的游戏。// 通常,Player是您使用同步变量或属性编写的组件Player player = gameobject.GetComponent();player.hairColor = message.hairColor;player.eyeColor = message.eyeColor;player.name = message.name;player.race = message.race;// 调用它以将此游戏对象用作主控制器NetworkServer.AddPlayerForConnection(conn, gameobject);}
}

准备状态

  除了Player,客户端连接也有“就绪”状态。主机向客户端发送有关生成的游戏对象和状态同步更新的就绪信息;未准备好的客户端不会发送这些更新。当客户端最初连接到服务器时,它还没有准备好。在这种非就绪状态下,客户端可以做一些不需要与服务器上的游戏状态进行实时交互的事情,例如加载场景、允许玩家选择头像或填写登录框.一旦客户端完成了所有的游戏前工作,并加载了所有资产,它可以调用 NetworkClient.Ready 进入“就绪”状态。上面的简单示例演示了就绪状态的实现;因为使用 NetworkServer.AddPlayerForConnection 添加player也会使客户端进入就绪状态(如果它尚未处于该状态)。

  客户端可以在没有准备好的情况下发送和接收网络消息,这也意味着他们可以在没有活动玩家游戏对象的情况下这样做。因此,即使没有玩家游戏对象,菜单或选择屏幕上的客户端也可以连接到游戏并与之交互。有关在不使用命令和 RPC 调用的情况下发送消息的更多详细信息,请参阅有关网络消息的文档。


切换Player

  要替换连接的玩家游戏对象,请使用 NetworkServer.ReplacePlayerForConnection。这对于限制玩家在特定时间可以发出的命令很有用,例如在赛前房间屏幕中。此函数采用与 AddPlayerForConnection 相同的参数,但允许该连接已经存在播放器。老玩家游戏对象不必被销毁。当房间中的所有玩家都准备好时,NetworkRoomManager 使用此技术从 NetworkRoomPlayer 游戏对象切换到游戏玩家游戏对象。

  您还可以使用 ReplacePlayerForConnection 重生玩家或更改代表玩家的对象。在某些情况下,最好禁用游戏对象并在重生时重置其游戏属性。以下代码示例演示了如何用新的游戏对象实际替换玩家游戏对象:

public class MyNetworkManager : NetworkManager
{public void ReplacePlayer(NetworkConnection conn, GameObject newPrefab){// 缓存对当前player对象的引用GameObject oldPlayer = conn.identity.gameObject;// 实例化新的player对象并广播给客户端// 为 keepAuthority 参数包含 true 以防止所有权更改NetworkServer.ReplacePlayerForConnection(conn, Instantiate(newPrefab), true);// 移除之前已被替换的玩家对象NetworkServer.Destroy(oldPlayer);}
}

  如果连接的玩家游戏对象被销毁,则该客户端无法执行命令。但是,它们仍然可以发送网络消息。

  要使用 ReplacePlayerForConnection,您必须拥有 NetworkConnection 游戏对象供玩家客户端建立游戏对象和客户端之间的关系。这通常是 NetworkBehaviour 类的 connectionToClient 属性,但如果旧player已被销毁,则可能无法立即使用。

  要查找连接,可以使用一些列表。如果使用 NetworkRoomManager,则房间播放器在 roomSlots 中可用。 NetworkServer 也有连接列表。

[Unity Mirror] 自定义角色生成相关推荐

  1. Unity C# 网络学习(十一)——自定义协议生成工具

    Unity C# 网络学习(十一)--自定义协议生成工具 在开发网络游戏中,协议是必不可少的东西,一款游戏可能有非常多的协议,但是协议的重复性非常高,而且前端后端都需要,人工完成显然不现实,可以通过共 ...

  2. Unity使用自定义资源(.asset)配置数据

    本文原创版权归 强哥的私房菜 所有,此处为转载,如有再转,请于篇首位置标明原创作者及出处,以示尊重! 作者:强哥的私房菜 原文:http://blog.csdn.net/liqiangeastsun/ ...

  3. Unity SRP自定义渲染管线 -- 1.Custom Pipeline

    该篇是对Catlike Coding这篇文章的概要总结,本人能力有限,如果有不正确的地方欢迎指正  https://catlikecoding.com/unity/tutorials/scriptab ...

  4. Unity大型场景程序化生成及优化技术—FPS迷宫生成和优化

    Unity大型场景程序化生成及优化技术-FPS迷宫生成和优化 1.知名游戏中的大型场景生成 场景程序化生成技术是一个广泛应用在游戏开发中的技术,较早的使用这类技术有名游戏<暗黑破坏神>系列 ...

  5. Unity自动化碰撞体生成方法-Normal Collider 和 碰撞体代理

    如何在Unity中对角色快速创建碰撞体(Normal Collider)和碰撞体代理(Fake Collider) 前言 快速给Humanoid人形角色添加碰撞体,使用Unity 的Collider系 ...

  6. Unity+Mirror实现虚拟现实下的多人连接

    实现虚拟现实环境中的多人连接顾名思义分为两步,首先通过Mirror插件实现3D空间下的多人连接基础功能,其后调整虚拟现实相关内容,最后添加虚拟化身并进行匹配.本篇文章也将从以下三个方面依次完成(使用设 ...

  7. Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物

    Unity 3D 人形角色动画(Avatar) Mecanim 动画系统适合人形角色动画的制作,人形骨架是在游戏中普遍采用的一种骨架结构.. 由于人形骨架在骨骼结构上的相似性,用户可以将动画效果从一个 ...

  8. Unity 实现自定义图片破碎效果-2D_Destruction

    Unity 实现自定义图片破碎效果-2D_Destruction 导引 效果预览 源码下载地址 实现流程 1.添加SrpiteRenderer组件 2.添加Explodable组件 3.Polygon ...

  9. 关于 mybatis-generator自定义注释生成 使用DefaultCommentGenerator重写来完成

    项目里新建表时model,mapper以及mapper.xml基本都是用Mybatis Generator(以下简称为MBG)自动生成的,但是MBG自动生成的model的注释实在有点非人类,至少中国人 ...

最新文章

  1. Debian 9 安装ASP .NET CORE
  2. 第3章 深入理解盒子模型
  3. OpenGL中的reshape函数(整理)
  4. 2n个整数分为两组,使两组和差的绝对值最小
  5. android读取assets中的html文件,android读取assets文件.htm
  6. mariadb mysql 5.6_MySQL / MariaDB 5.5 升级到 MySQL 5.6
  7. jQuery 的一个自动向上翻页的效果
  8. 计算机网络(9)-----TCP可靠传输的实现
  9. ASP.NET MVC框架(第一部分)
  10. 亚马逊与 Uber,软件开发的方式有何不同?
  11. PHP手机获取6为不反复验证码
  12. Web移动开发基本概念
  13. 阵列卡u盘安装系统步骤_Dell的R720服务器使用U盘安装系统
  14. 怎样提高数据库查询效率
  15. word字体号对应的磅数
  16. POI 设置某列为文本格式 (亲测可用!!)
  17. 二 关键词---关键词扩展(五)
  18. 设计模式之简单工厂、工厂方法、抽象工厂
  19. 深入理解Arduino下的ESP8266_Non-OS_SDK API① Non-OS SDK
  20. ARM Linux从Bootloader、kernel到filesystem启动流程

热门文章

  1. Office WORD如何为每一页设置不同的页眉页脚
  2. 用Woocommerce建立一个网上商店 [03] 增加产品类别
  3. Overload(重载)
  4. HiveOnSpark
  5. [Noi1999]钉子和小球
  6. android分享截屏到微信,Android 微信分享长图 ScrollView 生成长截图 View变bitmap
  7. java pdf替换内容_java PDF批量替换关键词
  8. 涂鸦 opengl简单应用1
  9. ★大塚 愛【LOVE IS BORN】~3rd Anniversary 2006~のライブDVD★
  10. 最详细新版网课联盟27刷网课平台源码+安装教程+最新模板+下载地址