【UNET自学日志】Part15 僵尸攻击玩家

在Zombie_Target脚本中,将targetTransform改为public

public  Transform targetTransform;

在预制件Zombie中添加新的脚本Zombie_Attack

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Zombie_Attack : NetworkBehaviour {

    //攻击频率
    private float attackRate = 3;
    //下一次攻击时间
    private float nextAttack;
    //伤害
    private int damage = 10;
    //与Player的最小距离,若小于这个值则进行攻击
    private float minDistance = 2;
    //与Player的距离
    private float currentDistance;
    //自身的transform
    private Transform myTransform;
    //Zombie_Target的脚本
    private Zombie_Target targetScript;

    //定义两个Material来代表是否攻击了玩家(绿色为没攻击,红色为攻击了)
    [SerializeField]
    private Material zombieGreen;
    [SerializeField]
    private Material zombieRed;


	void Start ()
    {
        //获取自身的transform和Zombie_Target脚本
        myTransform = transform;
        targetScript = GetComponent<Zombie_Target>();

        //如果是服务端,开启协程Attack
        if (isServer)
        {
            StartCoroutine(Attack());
        }
	}

    //检查目标玩家是否在范围内
    void CheckIfTargetInRange()
    {
        //如果目标玩家存在的话
        if (targetScript.targetTransform != null)
        {
            //计算僵尸与目标玩家之间的距离
            currentDistance = Vector3.Distance(targetScript.targetTransform.position, myTransform.position);

            //若小于最小距离且获取现在的时间,现在的时间也大于下一次攻击的时间
            if (currentDistance < minDistance && Time.time > nextAttack)
            {
                //将下一次攻击的时间定义为现在的时间加上攻击的频率
                nextAttack = Time.time + attackRate;
                //目标玩家的生命值减少
                targetScript.targetTransform.GetComponent<Player_Health>().DeductHealth(damage);
                //开启协程ChangeZombieMat(只在服务端进行)
                StartCoroutine(ChangeZombieMat());
                //调用函数
                RpcChangerZombieAppearance();
            }
        }
    }

    //将僵尸的material改为红色,过attackRate/2的时间后改为绿色
    IEnumerator ChangeZombieMat()
    {
        GetComponent<Renderer>().material = zombieRed;
        yield return new WaitForSeconds(attackRate/2);
        GetComponent<Renderer>().material = zombieGreen;
    }

    //告诉客户端开始协程ChangeZombieMat?
    [ClientRpc]
    void RpcChangerZombieAppearance()
    {
        StartCoroutine(ChangeZombieMat());
    }

    //检查目标玩家是否在范围内
    IEnumerator Attack()
    {
        for (; ; )
        {
            yield return new WaitForSeconds(0.2f);
            CheckIfTargetInRange();
        }
    }
}

这次写了注释了= =在考虑要不要录个视频什么的,关于UNET的教程国内好少,有点心塞

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值