Unity3D UNET 模仿局域网游戏(二)
紧接着上一篇博客,上一篇博客中,我们已经能够分别移动角色,并且控制他射击了,而且还稍微区分了一下不同的角色。这篇博客中我们继续讲解后面的内容。
既然角色都已经可以射击了,那肯定还得需要一个血量对吧,所以现在我们就添加血量。给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 模仿局域网游戏(二)相关推荐
- Unity3D UNET 模仿局域网游戏
这两天在学习的过程中,发现一个讲Unity的unet组件的好教程,在这里分享给大家. 新建一个 UnetProject. 新建一个GameObject重命名为Network Manager,给它添 ...
- unity之使用unet创建局域网游戏
教程译文连接:http://blog.sina.com.cn/u/2596401895
- Unity3d之坦克大战(二)
Unity3d之坦克大战(二) 这只是一个非常非常初级的教程.在 Unity3d之真机测试(上)我们创建了一个初级的坦克,今天继续坦克大战的游戏.下面开始吧: 1. 首先我们要创建一个炮弹.打开3DS ...
- c语言编写可乐瓶游戏,可乐瓶游戏二十则
<可乐瓶游戏二十则>由会员分享,可在线阅读,更多相关<可乐瓶游戏二十则(2页珍藏版)>请在人人文库网上搜索. 1.可乐瓶游戏二十则废弃的可乐瓶如果能合理地开发与运用,将创编出各 ...
- 内网计算机游戏不被检测,两台未联网的Win7电脑建立局域网游戏的方法
说到游戏,可能很多同学都会想到在学校时的光辉岁月,每当看到多个同学在玩同一个游戏时,就会有一个疑问,两台未联网的Win7电脑怎么建立局域网游戏的?下面小编将为大家分享两台未联网的Win7电脑建立局域网 ...
- 多人局域网游戏纯蓝图
多人局域网游戏学习笔记: 视频网址: https://www.bilibili.com/video/av42635205?from=search&seid=133006399851198673 ...
- 计算机和游戏建立不了连接,两台未联网的Win7电脑如何建立局域网游戏
两台未联网的Win7电脑怎么建立局域网游戏的?下面将为大家分享两台未联网的Win7电脑建立局域网游戏的方法.一起去看看吧! 不联网的两台或多台电脑建立局域网玩游戏方法一: 要是不上网,用HUB(HUB ...
- Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- Unity3D是怎么提升游戏运行效率的?
2019独角兽企业重金招聘Python工程师标准>>> 先感谢一下作者软件民工,今天要分享3d素材unity3d是怎么提升游戏运行效率的? 用c#写的i++和c写的i++,编译后的机 ...
最新文章
- CentOS 7.4 安装 MySQL 5.6.40 完美教程
- android 自定义皮肤,Android Studio 自定义皮肤主题和背景
- Angualr中通过原生js和ViewChild的方式获取dom
- 【powerdesigner】将pdm或者cdm保存为普通图片格式
- mfc ctabctrl 双排显示_盐城便宜的开口型双排脚手架生产厂家-斯戴博盘扣脚手架...
- c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析
- jQuery .tmpl(), .template()学习
- 基于JAVA+SpringMVC+MYSQL的在线英语精品课程视频教学平台
- Mysql系列一:SQL入门
- 【Zend Studio】10.6.0版本设置默认编码为UTF-8
- 抓鸡 抓服务器 1433 3306 全自动效率抓鸡
- 浅谈在线IDE的搭建,配置,体验
- 列主元Guass消去法
- 国产操作系统要起来?自主银河麒麟V10发布!
- GNSS观测数据下载地址
- kubebuilder之一:kubernetes operator工作原理
- NetKeeper(创翼)开WIFI方法——2018.5
- 每日工作记录——ERROR:Simulator:793 - Unable to elaborate instantiated module work
- android手机桌面管理,Android桌面管理
- IE浏览器打开ie模式
热门文章
- 基于STM32F407的简易菜单设计+LCD+按键
- 【高效办公】批量生成指定文件名文件夹
- python使用Neo4j图数据库——py2neo详解(1)
- c语言生成点阵字体,字符(图片)转化为字符(ASCII)点阵的程序,有真相
- CASIA情感数据库
- “老三样”会思考:以威胁情报驱动安全产品演进
- js 所有空格替换成任意字符
- [附源码]Java计算机毕业设计SSM高校教室管理系统
- MATLAB中.mat文件转为excel(.xlsx)
- js混淆加密,通过混淆Js代码让别人(很难)还原,js代码加密