这一讲来讲如何设置人物生成的位置并且同步到所有客户端。
首先讲如何在两个固定的位置,交替循环生成。就是现在A点生成下一个在B点生成,然后再在A点生成下一个再在B点生成,如此反复循环。
首先在场景中新建两个空物体作为生成的位置,分别命名为networkstartposition1和networkstartposition2,放到两个不同的坐标位置。在两个上面都添加Network Start Position组件。如图:
接下来在network manager里面把人物生成的方式改为Round Robin,如图:
如此便实现了人物初始生成时,只会在这两个位置轮流生成。
------------------------------------------下面实现如何随机生成功能-------------------------------------------------
上面所做的都是随机生成的前部分步骤,下面要实现的就是要在刚才的两个生成点之间随机生成主角的位置,不过是在主角复活的时候随机生成。
思路就是将这两个位置作为一个数组,然后随机选取这两个中的一个作为生成点。
代码如下(依旧是在health里进行改动):
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.Networking;
public class health : NetworkBehaviour {
public const int maxhealth = 100;
[SyncVar (hook ="changevalue")]//同步变量,改变currenthealth的值。一直会调用changevalue方法。
public int currenthealth = maxhealth;
public Slider healthslider;
private NetworkStartPosition[] spawnpoints;
void Start()
{ //获取到场景中所有带有NetworkStartPosition组件的物体
if (isLocalPlayer)
spawnpoints = FindObjectsOfType<NetworkStartPosition>();
}
/// <summary>
///在Server端运行
/// </summary>
/// <param name="damage"></param>
public void Takedamage(int damage)
{
if (isServer == false)
{
return;
}
currenthealth -= damage;
if (currenthealth<=0)
{
currenthealth = maxhealth;
Rpcspawnnew();//满血复活到原点
}
}
/// <summary>
/// 该方法里需要定义一个参数,传入的参数就是上面定义的同步的currenthealth的值
/// </summary>
/// <param name="healthvalue"></param>
void changevalue(int healthvalue)
{
healthslider.value = healthvalue / (float)maxhealth;
}
/// <summary>
/// 所有客户端同步执行该方法
/// </summary>
[ClientRpc]
void Rpcspawnnew()
{
if (isLocalPlayer == false)
{
return;
}
Vector3 spawnposition = Vector3.zero;
if (spawnpoints != null && spawnpoints.Length > 0)
{
//随机选取数组中的一个NetworkStartPosition作为位置
spawnposition = spawnpoints[Random.Range(0, spawnpoints.Length)].transform.position;
}
transform.position = spawnposition;
}
}
解释以上代码,在Start方法里获取到所有带有NetworkStartPosition组件的东西,然后放到数组里(本案例里只有两个)。然后在主角死亡后生成的Rpcspawnnew方法里对其位置进行设置。
这样就实现了主角随机位置生成的功能。这次就不录制gif图片了!
至此network的基础知识就讲完了。老夫又要陷入潜水状态了。