紧接着上一篇博客,上一篇博客中,我们已经能够分别移动角色,并且控制他射击了,而且还稍微区分了一下不同的角色。这篇博客中我们继续讲解后面的内容。 
既然角色都已经可以射击了,那肯定还得需要一个血量对吧,所以现在我们就添加血量。给Player添加Health脚本并编辑:

using UnityEngine;
using System.Collections;public class Health : MonoBehaviour {public const int maxHealth = 100;   //最大血量public int currentHealth = maxHealth;   //当前血量//当玩家和子弹碰撞时调用的方法public void TakeDamage(int damage){currentHealth -= damage;if (currentHealth <= 0)   //如果当前血量小于等于0   {currentHealth = maxHealth;    //就让他回复满血状态,方便后面我们让他重生时需要}}
}

然后需要给Player添加一个Tag 名字为”Player”,给子弹也就是Bullet 添加一个脚本Bullet,并编辑:

using UnityEngine;
using System.Collections;public class Bullet : MonoBehaviour {//当子弹与物体碰撞时void OnCollisionEnter(Collision other){//如果碰撞的物体的Tag 是Playerif (other.collider.tag == "Player"){//调用碰撞物体的TakeDamage,传递一个参数是10other.collider.SendMessage("TakeDamage", 10);Destroy(gameObject);  //销毁子弹}}
}

既然有了血量,我们是不是就应该给他添加一个血条,现在我们就添加血条。新建UI–>Slider,然后把slider下的Handle Slide Area删掉,把Fill 移动到Background的子物体,再把Fill Area删掉。 
 
把 Fill 选择填充父背景,也就是Background,保证他们两个一样大。修改颜色成绿色,Bbackgroud修改颜色成红色。Fill 选择这个 
 
然后这是效果图 
 
最后,我们要把这个血条添加到角色身上去。选中Canvas,Render Mode改为World Space,让摄像机渲染这个UI。把Canvas拖到Player的子物体。做如下改变: 
 
拖动Slider到角色头顶,然后效果图 

血条就添加好了,现在我们让他能够随着生命值改变。修改Health类

using UnityEngine;
using System.Collections;
using UnityEngine.UI;public class Health : MonoBehaviour {public const int maxHealth = 100;   //最大血量public int currentHealth = maxHealth;   //当前血量public Slider healthSlider;//当玩家和子弹碰撞时调用的方法public void TakeDamage(int damage){currentHealth -= damage;if (currentHealth <= 0)   //如果当前血量小于等于0   {currentHealth = maxHealth;    //就让他回复满血状态,方便后面我们让他重生时需要}healthSlider.value = (float)currentHealth / maxHealth;    //修改Slider的比例}
}

这时我们发现当角色旋转时,血条也会旋转,看起来不美观,我们让他只”看着摄像机”。 
给Canvas添加一个脚本LookAtCamera并编辑

using UnityEngine;
using System.Collections;public class LookAtCamera : MonoBehaviour {// Update is called once per framevoid Update () {transform.LookAt(Camera.main.transform);}
}

这样血条就会一直对着摄像机了。现在运行游戏,是可以使用的, 

但是!!细心的你会发现,他们的血条有可能不同步。这是因为,血量的判断在客户端和服务端都进行了判断,相当于各自计算各自的,但是!!当服务端的子弹碰撞到Player时,会计算生命值,然后销毁子弹,而当服务端的子弹销毁时,客户端的子弹也会跟着一起消失,而服务端已经计算了,而客户端没有计算(就像网络游戏有延迟一样),就会导致不同步。现在我们来让子弹同步。要解决这个问题,我们就要让血量的检测在服务端进行,然后同步到客户端就行了。修改Health类继承NetworkBehaviour,

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.Networking;public class Health : NetworkBehaviour {public const int maxHealth = 100;   //最大血量//检测一个属性,当服务端改变值时,会同步到客户端//当值改变时,会调用一个方法 如:OnChangeHealth[SyncVar(hook = "OnChangeHealth")]   public int currentHealth = maxHealth;   //当前血量public Slider healthSlider;//当玩家和子弹碰撞时调用的方法public void TakeDamage(int damage){if (!isServer)   //如果不是服务端{return;}currentHealth -= damage;if (currentHealth <= 0)   //如果当前血量小于等于0   {currentHealth = maxHealth;    //就让他回复满血状态,方便后面我们让他重生时需要}}//当服务端检测的属性值改变时调用的方法//health:改变后的值void OnChangeHealth (int health){healthSlider.value = (float)health / maxHealth;    //修改Slider的比例}
}

这时候就同步了。。接下来我们设置当角色生命值为0时重生。修改Health类,这里修改的地方比较少,我就直接放修改的图片,大家对应着修改就行了。 

这时候运行,你会发现,只有当客户端攻击时角色死亡位置才会重置,服务端攻击不会。这是因为一开始我们设置了, 
 
这代表只有客户端才有权限,而服务端的攻击然后重置位置,这是没有权限的,所以现在我们要让它能够在服务端也重置位置,修改Health类

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.Networking;public class Health : NetworkBehaviour {public const int maxHealth = 100;   //最大血量//检测一个属性,当服务端改变值时,会同步到客户端//当值改变时,会调用一个方法 如:OnChangeHealth[SyncVar(hook = "OnChangeHealth")]   public int currentHealth = maxHealth;   //当前血量public Slider healthSlider;//当玩家和子弹碰撞时调用的方法public void TakeDamage(int damage){if (!isServer)   //如果不是服务端{return;}currentHealth -= damage;if (currentHealth <= 0)   //如果当前血量小于等于0   {currentHealth = maxHealth;    //就让他回复满血状态,方便后面我们让他重生时需要RpcRespawn();     //调用一个方法,设置重生的位置}}//当服务端检测的属性值改变时调用的方法//health:改变后的值void OnChangeHealth (int health){healthSlider.value = (float)health / maxHealth;    //修改Slider的比例}//远程调用,表示调用这个方法时就会在客户端调用,方法名必须以Rpc开头[ClientRpc]   void RpcRespawn(){if (!isLocalPlayer){return;}transform.position = Vector3.zero;   //把位置设置到0,0,0}
}

这时候就可以同步了。在下一篇博客中我们将对游戏增加一点小内容。 
本博客用作新手学习讨论,如有不好或错误的地方也请指出来,谢谢。

Unity3D UNET 模仿局域网游戏(二)相关推荐

  1. Unity3D UNET 模仿局域网游戏

    这两天在学习的过程中,发现一个讲Unity的unet组件的好教程,在这里分享给大家.  新建一个 UnetProject.  新建一个GameObject重命名为Network Manager,给它添 ...

  2. unity之使用unet创建局域网游戏

    教程译文连接:http://blog.sina.com.cn/u/2596401895

  3. Unity3d之坦克大战(二)

    Unity3d之坦克大战(二) 这只是一个非常非常初级的教程.在 Unity3d之真机测试(上)我们创建了一个初级的坦克,今天继续坦克大战的游戏.下面开始吧: 1. 首先我们要创建一个炮弹.打开3DS ...

  4. c语言编写可乐瓶游戏,可乐瓶游戏二十则

    <可乐瓶游戏二十则>由会员分享,可在线阅读,更多相关<可乐瓶游戏二十则(2页珍藏版)>请在人人文库网上搜索. 1.可乐瓶游戏二十则废弃的可乐瓶如果能合理地开发与运用,将创编出各 ...

  5. 内网计算机游戏不被检测,两台未联网的Win7电脑建立局域网游戏的方法

    说到游戏,可能很多同学都会想到在学校时的光辉岁月,每当看到多个同学在玩同一个游戏时,就会有一个疑问,两台未联网的Win7电脑怎么建立局域网游戏的?下面小编将为大家分享两台未联网的Win7电脑建立局域网 ...

  6. 多人局域网游戏纯蓝图

    多人局域网游戏学习笔记: 视频网址: https://www.bilibili.com/video/av42635205?from=search&seid=133006399851198673 ...

  7. 计算机和游戏建立不了连接,两台未联网的Win7电脑如何建立局域网游戏

    两台未联网的Win7电脑怎么建立局域网游戏的?下面将为大家分享两台未联网的Win7电脑建立局域网游戏的方法.一起去看看吧! 不联网的两台或多台电脑建立局域网玩游戏方法一: 要是不上网,用HUB(HUB ...

  8. Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...

  9. Unity3D是怎么提升游戏运行效率的?

    2019独角兽企业重金招聘Python工程师标准>>> 先感谢一下作者软件民工,今天要分享3d素材unity3d是怎么提升游戏运行效率的? 用c#写的i++和c写的i++,编译后的机 ...

最新文章

  1. CentOS 7.4 安装 MySQL 5.6.40 完美教程
  2. android 自定义皮肤,Android Studio 自定义皮肤主题和背景
  3. Angualr中通过原生js和ViewChild的方式获取dom
  4. 【powerdesigner】将pdm或者cdm保存为普通图片格式
  5. mfc ctabctrl 双排显示_盐城便宜的开口型双排脚手架生产厂家-斯戴博盘扣脚手架...
  6. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析
  7. jQuery .tmpl(), .template()学习
  8. 基于JAVA+SpringMVC+MYSQL的在线英语精品课程视频教学平台
  9. Mysql系列一:SQL入门
  10. 【Zend Studio】10.6.0版本设置默认编码为UTF-8
  11. 抓鸡 抓服务器 1433 3306 全自动效率抓鸡
  12. 浅谈在线IDE的搭建,配置,体验
  13. 列主元Guass消去法
  14. 国产操作系统要起来?自主银河麒麟V10发布!
  15. GNSS观测数据下载地址
  16. kubebuilder之一:kubernetes operator工作原理
  17. NetKeeper(创翼)开WIFI方法——2018.5
  18. 每日工作记录——ERROR:Simulator:793 - Unable to elaborate instantiated module work
  19. android手机桌面管理,Android桌面管理
  20. IE浏览器打开ie模式

热门文章

  1. 基于STM32F407的简易菜单设计+LCD+按键
  2. 【高效办公】批量生成指定文件名文件夹
  3. python使用Neo4j图数据库——py2neo详解(1)
  4. c语言生成点阵字体,字符(图片)转化为字符(ASCII)点阵的程序,有真相
  5. CASIA情感数据库
  6. “老三样”会思考:以威胁情报驱动安全产品演进
  7. js 所有空格替换成任意字符
  8. [附源码]Java计算机毕业设计SSM高校教室管理系统
  9. MATLAB中.mat文件转为excel(.xlsx)
  10. js混淆加密,通过混淆Js代码让别人(很难)还原,js代码加密