Unity5之Network随机生成主角位置

这一讲来讲如何设置人物生成的位置并且同步到所有客户端。

首先讲如何在两个固定的位置,交替循环生成。就是现在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的基础知识就讲完了。老夫又要陷入潜水状态了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值