Unity3D UNET 模仿局域网游戏(三)
2016-05-04 11:37
429 查看
继续上篇博客,我们已经可以发射子弹并让角色受到伤害了。现在我们创建一些“炮灰”。使用Player进行修改外观,
取名为Enemy,做成Prefab。是不是有点小混混的感觉。。
在场景中新建一个空物体,重命名为EnemySpawn,作为炮灰孵化器,用来生产炮灰。现在我们生产炮灰,这个炮灰需要在服务端生成,并且同步到客户端端。修改Network Manager
给EnemySpawn添加Network Identity组件,勾选Server Only表示只有服务端有权限。在给他添加EnemySpawn脚本并编辑:
效果:
如果看不清的话,可以修改一下摄像机的位置。。
现在是能正常运行的,但是,攻击炮灰它并不会消失,现在就让他会消失。编辑Health类,这里要修改的代码比较少,我就直接贴图,大家修改对应的地方就行了:
注意:这里需要选中Enemy这个Prefab勾选destroyOnDeath
现在就可以正常消灭炮灰了
最后,我们在场景中添加两个空物体,位置不要一样,分开一点。名字取为:Network Start Position1和Network Start Position2.都给他们添加Network Start Position这个组件。因为他们身上有这个组件,Network Manager会得到这两个东西。修改 Network Manager
就是挨着这两个位置依次生成,现在控制角色重生时随机在这两个点的位置上,修改Health类:
现在运行就能获得效果了。当角色生成时会在设置的两个点上依次生成,而当它重生时,会随机在两个点上生成。
好,本次博客到此为止。
文件工程已经上传:http://pan.baidu.com/s/1pKSGZG3 密码:c4cr
本博客用作新手学习讨论,如有不好或错误的地方也请指出来,谢谢。
取名为Enemy,做成Prefab。是不是有点小混混的感觉。。
在场景中新建一个空物体,重命名为EnemySpawn,作为炮灰孵化器,用来生产炮灰。现在我们生产炮灰,这个炮灰需要在服务端生成,并且同步到客户端端。修改Network Manager
给EnemySpawn添加Network Identity组件,勾选Server Only表示只有服务端有权限。在给他添加EnemySpawn脚本并编辑:
using UnityEngine; using System.Collections; using UnityEngine.Networking; public class EnemySpawn : NetworkBehaviour { public GameObject enemyPre; //用来得到炮灰这个物体 public int enemyCount = 6; //定义要生成的炮灰的数量 //NetworkBehaviour 的内置方法,当服务器启动时调用 public override void OnStartServer() { for (int i = 0; i < enemyCount; i ++) { //给要生产的炮灰一个随机位置,高度不变 Vector3 ePosition = new Vector3(Random.Range(-8f, 8f), 0, Random.Range(-8f, 8f)); //给他一个方向,就是围绕Y轴旋转,其他不变 //Quaternion.Euler:把一个旋转转成四元素 Quaternion eRotation = Quaternion.Euler(0, Random.Range(0f, 360f), 0); //实例化出这个炮灰 GameObject enemy = Instantiate(enemyPre, ePosition, eRotation) as GameObject; NetworkServer.Spawn(enemy); //在每个客户端上都生成一个物体 } } }
效果:
如果看不清的话,可以修改一下摄像机的位置。。
现在是能正常运行的,但是,攻击炮灰它并不会消失,现在就让他会消失。编辑Health类,这里要修改的代码比较少,我就直接贴图,大家修改对应的地方就行了:
注意:这里需要选中Enemy这个Prefab勾选destroyOnDeath
现在就可以正常消灭炮灰了
最后,我们在场景中添加两个空物体,位置不要一样,分开一点。名字取为:Network Start Position1和Network Start Position2.都给他们添加Network Start Position这个组件。因为他们身上有这个组件,Network Manager会得到这两个东西。修改 Network Manager
就是挨着这两个位置依次生成,现在控制角色重生时随机在这两个点的位置上,修改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 bool destroyOnDeath = false; //用来判断该不该销毁该物体 private NetworkStartPosition[] spawnPoints; //得到这个 NetworkStartPosition 组件 void Start () { if (isLocalPlayer) //如果是客户端 { spawnPoints = FindObjectsOfType<NetworkStartPosition>(); } } //当玩家和子弹碰撞时调用的方法 public void TakeDamage(int damage) { if (!isServer) //如果不是服务端 { return; } currentHealth -= damage; if (currentHealth <= 0) //如果当前血量小于等于0 { if (destroyOnDeath) //判断是不是可以销毁的对象 { Destroy(gameObject); return; } currentHealth = maxHealth; //就让他回复满血状态,方便后面我们让他重生时需要 RpcRespawn(); //调用一个方法,设置重生的位置 } } //当服务端检测的属性值改变时调用的方法 //health:改变后的值 void OnChangeHealth (int health) { healthSlider.value = (float)health / maxHealth; //修改Slider的比例 } //远程调用,表示调用这个方法时就会在客户端调用,方法名必须以Rpc开头 [ClientRpc] void RpcRespawn() { if (!isLocalPlayer) { return; } Vector3 spawnPosition = Vector3.zero; if (spawnPoints != null && spawnPoints.Length > 0) { //随机获取NetworkStartPosition数组中的一个,在得到它的位置 spawnPosition = spawnPoints[Random.Range(0, spawnPoints.Length)].transform.position; } transform.position = spawnPosition; } }
现在运行就能获得效果了。当角色生成时会在设置的两个点上依次生成,而当它重生时,会随机在两个点上生成。
好,本次博客到此为止。
文件工程已经上传:http://pan.baidu.com/s/1pKSGZG3 密码:c4cr
本博客用作新手学习讨论,如有不好或错误的地方也请指出来,谢谢。
相关文章推荐
- Kinect结合Unity3D引擎开发体感游戏(一)
- 我是运营,我没有假期
- [原创]java局域网聊天系统
- 每个 Linux 游戏玩家都绝不想要的恼人体验
- 在 Fedora 上使用 Steam play 和 Proton 来玩 Windows 游戏
- Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
- 如何使用 Steam Play 在 Linux 上玩仅限 Windows 的游戏
- 新一代iPad适配应用之游戏篇
- 一个注册表搞定“打开局域网机器文件提示”
- VB实现的《QQ美女找茬游戏》作弊器实例
- 通过批处理bat解决局域网打印机共享问题
- 局域网遭遇“ARP”病毒的新变种附临时解决方法
- 远程连接局域网内的SQL Server 的方法
- C#实现洗牌游戏实例
- C#实现的算24点游戏算法实例分析
- 如何解决局域网内mysql数据库连接慢
- C#实现简单的井字游戏实例
- C++编写简单的打靶游戏
- C++实现基于控制台界面的吃豆子游戏