您的位置:首页 > 移动开发 > Unity3D

Unity3D UNET 模仿局域网游戏(三)

2016-05-04 11:37 429 查看
继续上篇博客,我们已经可以发射子弹并让角色受到伤害了。现在我们创建一些“炮灰”。使用Player进行修改外观,



取名为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

本博客用作新手学习讨论,如有不好或错误的地方也请指出来,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  局域网 unity3d 游戏