【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的教程國內好少,有點心塞
發佈了43 篇原創文章 · 獲贊 17 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章