在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的教程國內好少,有點心塞