在单机游戏开发中,角色的武器是经常可以更换的,角色更换武器的基本原理是将武器挂接到角色的骨骼动画的虚拟点上,这样角色做动作时,武器也会随着骨骼进行运动,完成了角色挂接武器,这个挂接武器流程是固定的。而在网络游戏中,做挂接武器时就要注意了,下面就以Photon服务器为例给读者介绍如何实现在网络游戏中给角色挂接武器,当然其他网络游戏的挂接方式类似。

在网络游戏中更换角色武器需要注意以下几点:

一、玩家自身更换武器,其他玩家NPC更换武器,实现方式是不一样的。

二、玩家更换的武器或者其他玩家NPC更换的武器,彼此都是可见的。

下面开始具体实现:

首先我们程序在写逻辑时,玩家自身的武器一般是存放到背包里面,需要玩家打开背包从里面把武器取出来挂接到角色的骨骼动画的虚拟挂节点上,这个是固定的流程。网络游戏就要涉及到玩家相互之间是可见的,这就要求挂接的武器彼此都能看到。需要对武器挂接脚本。先分析一下,武器挂接到角色的骨骼上后,角色要播放动作,动作上下左右会有一个位移也就是位置的变换,当然不同的招式也会涉及到武器的方向的变换,更有甚者会有武器的大小变换。这些变换对其玩家都是可见的,这就需要我们对武器的实例化模型做一些处理,如下图所示:

这个是武器的实例化模型上面的脚本,一个是Photon View该组件就是实现彼此可见的,另一个是PhotonTransformView脚本,这个是同步武器的位置,方向和大小的。有一点很重要就是将PhotonTransformView组件拖到Observed Components里面作为一个观察对象,时刻监听武器的一举一动,这样就完成了武器同步的设置。

下面再生成其他玩家武器的同步,我们自己的玩家是通过背包挂接,要想在你的场景中生成其他玩家以及武器的挂接就需要通过服务器接收消息完成了。在Photon中接收服务器的消息是通过NetworkingPeer脚本中的函数public void OnEvent(EventData photonEvent)实现的,在这个函数中有一条语句:

            case PunEvent.Instantiation:this.DoInstantiate((Hashtable)photonEvent[ParameterCode.Data], originatingPlayer, null);break;

就是服务器广播消息使用的,我们可以通过这个函数拿到角色信息,将其实例化出来,大家还要清楚一点,武器是与角色息息相关的,换句话说,我们可以将武器作为角色的一个属性处理。实现代码如下所示:

            object[] objs = new object[] { "vAssaultRifle"};GameObject playerobj =  PhotonNetwork.Instantiate("ShooterMeleeTopDown", new Vector3(Random.Range(1f, 8f), 0.0f, -35f), Quaternion.identity, 0, objs);

调用的函数接口是带有object[]参数的实例化函数,这样就可以把角色的武器名字传进去了,传进去后,我们还应该能拿到,目的是将其实例化出来,让其他玩家可以看到,再看一下拿到该武器信息的代码,如下所示:

 PhotonView photonView = PhotonView.Get(this);
        if (!photonView.isMine){object[] objs = photonView.instantiationData;Invector.ItemManager.EquipPoint equipoint = transform.GetComponent<Invector.ItemManager.vItemManager>().equipPoints.Find(p => p.equipPointName == "RightArm");GameObject obj = Resources.Load(objs[0].ToString()) as GameObject;var equipedObject = Instantiate(obj, equipoint.handler.defaultHandler.position, equipoint.handler.defaultHandler.rotation);if(equipoint.handler.defaultHandler.childCount == 0){equipedObject.transform.parent = equipoint.handler.defaultHandler;equipoint.equipmentReference.equipedObject = transform.gameObject;equipoint.onInstantiateEquiment.Invoke(equipedObject);}else{Destroy(equipoint.handler.defaultHandler.GetChild(0));}}

第一行代码是获取PhotonView组件,这个主要是用于同步使用的,然后判断一下,武器是不是用户玩家自身的,因为自身玩家不需要走这个流程,所以要排除掉,我们同步的是其他玩家NPC。通过

photonView.instantiationData

拿到武器信息,当然这里可以不知武器信息,其他血条什么的都可以放在里面处理。

equipoint = transform.GetComponent<Invector.ItemManager.vItemManager>().equipPoints.Find(p => p.equipPointName == "RightArm");

是武器挂节点,实例化出来的武器要挂接到骨骼动画上,设置一下武器的父节点,这样就完成了武器的挂接,实现效果如下所示:

这样我们就完成了角色武器的更换,各个角色利用Photon实现了武器的同步处理,教程完成,下一篇介绍角色动作同步处理。

Photon与Unity核心技术之角色更换武器相关推荐

  1. photon四种同步方式_Photon与Unity核心技术之角色动作同步 - 纳金网

    文章标题:Photon与Unity核心技术之角色动作同步 文章作者:海洋_(CSDN ) 本篇介绍关于使用Photon实现角色同步,客户端还是选择Unity开发,在实现动作之前,Unity为我们提供了 ...

  2. Unity 3D 动画系统(Mecanim)|| Unity 3D 人形角色动画(Avatar)

    Unity 3D 动画系统(Mecanim) Mecanim 动画系统是 Unity 公司推出的全新动画系统,具有重定向.可融合等诸多新特性,可以帮助程序设计人员通过和美工人员的配合快速设计出角色动画 ...

  3. Unity 之 实用技巧更换编辑器主题

    Unity 之 实用技巧更换编辑器主题 前言 一,两种主题效果展示 1.1 浅色主题 1.2 深色主题 二,Windows更换步骤 三,Mac更换步骤 四,低版本换肤 总结 前言 很多小伙伴都知道在U ...

  4. Photon在unity中的使用

    ps:期末老师要求的一篇3000字的玩具级别论文,基本是官网和api手册原本就有的.基本我就是个搬运工,不知道有什么用,就先扔上来了.用的是writage,让word转为markdown,可能会出现一 ...

  5. 详解Unity中的角色控制器

    前言 如何让玩家所操纵的角色动起来,这在Unity中很容易实现,但是如何确保玩家所操作的角色不会产生一些非常违反物理常识的情况?而这就需要进行大量的检测,已确保玩家所操纵的角色正常.所幸Unity为我 ...

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

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

  7. 001_StarterPlatformGame_角色,武器,控制类

    ----------------------------------StarterPlatformGame---李明阳2015-2-19-------------------------------- ...

  8. fbx格式转gif_传奇战法道 角色人物武器3D模型动作 FBX unity格式

    # e: d' H( E9 {& ~+ [0 g7 }传奇类游戏资源,都是低模手游级别,面数在2000到4000之间,骨骼数量在30到50左右,动作和传奇一样,基本的走,攻击,技能,被击,死亡 ...

  9. unity之游戏角色换装实现

    http://www.cnblogs.com/shamoyuu/p/6505561.html 一.换装原理 游戏角色换装分为以下几步: 1.替换蒙皮网格 2.刷新骨骼 3.替换材质 上面这种是比较简单 ...

  10. Unity 第三人称角色控制器:动画混合树、Cinemachine等功能或插件的使用

    前言: 无论是RPG.ACT.AVG还是TPS游戏,都有大量的以第三人称为人物视角的游戏作品,尤其是TPS,直接以第三人称为特点来命名 游戏类型: RPG:角色扮演游戏 ACT:动作游戏 AVG:冒险 ...

最新文章

  1. 一种在注入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路
  2. 基于数据库数据增量同步_基于canal实现分布式数据同步
  3. 瑞士军刀——Pandoc
  4. asa hacker
  5. 60秒计时器的仿真电路_物联网应用基于Arm微控制器的低功耗定时关机计时器
  6. Redis 命令--Redis列表(List))
  7. 在html怎么使用php函数,php htmlentities函数讲解及使用实例
  8. clickhouse原理解析与应用实践_Hybrid App (混合应用) 技术全解析 方案原理篇
  9. android 6.0 dm-verity技术,Android 7.0安全性大幅提升,要求严格强制执行验证启动
  10. linux 自动安装mysql数据库_linux系统下源码安装mysql5.6数据库
  11. DevExpress学习笔记之如何获取Repository Item的值
  12. 问卷调查微信小程序源码
  13. UIControl 纠错
  14. 山东交通学院c语言程序设计,山东交通学院 c语言题库.doc
  15. Sentaurus入门(3):sde
  16. php codeigniter ext,PHP CodeIgniter框架源码解析
  17. asan c/c++内存检测
  18. java健身房管理系统业务_基于SSM的健身房管理系统
  19. 微信公众号文章怎么添加附件|详细教程讲解,太实用了!
  20. 为什么有了路由器还要光猫

热门文章

  1. 云队友丨如何长久、持续且稳定的做一件事?
  2. 《工业控制系统信息安全防护指南》产品措施匹配表
  3. java导出eml_java 本地生成带附件的eml文件
  4. R语言:基本变量及其之间关系探索分析
  5. 介绍一个可以把安卓手机屏幕投影到电脑上的办法
  6. 2017先给自己定一个小目标,比方说先挣一个亿
  7. 腾达路由器怎么设置网站服务服务器,腾达(Tenda)-无线路由器如何设置上网?
  8. 让你的Win10桌面比macOS还简洁漂亮高大上
  9. 用于将 InfoPath 2007 集成到 Visual Studio 2005 中的 InfoPath Designer API 概述
  10. 全网最详细的Intel CPU体系结构分析(内核源码)