Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class Turrets : MonoBehaviour {
public GameObject Guns;//Объект орудий
public GameObject PointGun1,PointGun2,PointGun3,PointGun4;//Точки выстрела вешаются на концы орудий
public GameObject Platforma;//Платформа на которой орудия находятся
public GameObject Target;//Цель
public GameObject BulletPref;//Префаб пули
public float MaxAngle;//Угол возвышения орудий
public string Tag1,Tag2;//Тэги целей
public float AgroRadius;//Радиус обнаружения целей
public float DistanceFire;//Дальность стрельбы
public float MaxRot;// Max сила ротации
public float shootSpeed = 1;
public float lastShotTime,LastTimeDisor;
public float TimeDisor;//Время ведения цели до переключения на новую цель в нулевом секторе огня
public float TimeNewTar;//Время до переключения на новую цель
float Ugol,TimeNewTar1;
Quaternion rotateTo1,rotateTo2;
float yRot;
string TargetTag;//тег таргета
private Quaternion ZeroRot; // кватернион нулевой позиций поворота
// Use this for initialization
void Start () {
lastShotTime=0;
}
void LockTarget (){//Поиск и захват цели,цель выбирается Всяко ))
//int Len;//число целей на сцене
float Distanc;//Дистанция до цели
GameObject <img src="./images/smilies/unmarked.gif" alt="[]" title="Запланировано" /> gos;//Массив для целей
gos = GameObject.FindGameObjectsWithTag(TargetTag);//Пишем в массив цели
//if (gos==null) return;//Если пусто-выходим
if (gos.Length==0) return;
if ((TargetTag == "Player") && (gos!=null)) {Target = gos[0];return;}//Если цель игрок то запись в таргет игрока и выход
//Len =(int)(Random.Range(0,gos.Length-1));//Рандомная выборка цели
//Target = gos [Len];
//Debug.Log(gos.Length);
Distanc = Vector3.Distance(transform.position,gos[0].transform.position);//Записываем дистанцию до 1-го ГО
Target = gos[0];//Запись в таргет 1-го ГО
//Выбираем ближнюю цель
foreach (GameObject go in gos){
if (Distanc>Vector3.Distance(transform.position,go.transform.position)){
Distanc=Vector3.Distance(transform.position,go.transform.position);
Target = go;
}
}
if (Vector3.Distance(transform.position,Target.transform.position)>AgroRadius) Target=null;//Если цель далеко вырубаем ее
}
void Attack (){
float Distance = Vector3.Distance(transform.position,Target.transform.position);//Дистанция до цели
Uprejdenie upr = this.gameObject.GetComponent <Uprejdenie> ();//Получаем доступ к скрипту упреждения
upr.Target = Target;//Передаем цель
//upr.pos - получение позиции для стрельбы
Vector3 posit =upr.pos;
if ((Random.value>0.5f)&&(Target.tag=="Player")) posit += new Vector3(0,0,-5);//Даем шанс игроку )))
rotateTo1 = Quaternion.LookRotation(posit - Platforma.transform.position);//Слежение орудий за целью
rotateTo2 = Quaternion.LookRotation(posit - Guns.transform.position);
Platforma.transform.rotation = Quaternion.Slerp(Platforma.transform.rotation,rotateTo1,Time.deltaTime*MaxRot);
Platforma.transform.localRotation = Quaternion.Euler(0.0f,Platforma.transform.localRotation.eulerAngles.y,0.0f);//Врвщение только по y
Guns.transform.rotation = Quaternion.Slerp(Guns.transform.rotation,rotateTo2,Time.deltaTime*MaxRot);
Guns.transform.localRotation = Quaternion.Euler(Guns.transform.localRotation.eulerAngles.x,0.0f,0.0f);//Вращение только по X и Y
{
float Ang = AngleAroundAxis(Guns.transform.forward,posit,Vector3.forward); //Угол между целью и орудиями
if ((Ang>-20)&&(Ang<20)&&(Time.time>(lastShotTime + shootSpeed))&&((Distance)<DistanceFire)&&(Ugol<0)){
if (PointGun1) Instantiate(BulletPref ,PointGun1.transform.position,PointGun1.transform.rotation);
if (PointGun2) Instantiate(BulletPref ,PointGun2.transform.position,PointGun2.transform.rotation);
lastShotTime = Time.time;
LastTimeDisor = 0; //Обнуляем таймер слежения
}
//
}
if (LastTimeDisor>=TimeDisor) Target = null;//Если превысили время слежения в мертвом секторе переключаемся на другую
}
// Update is called once per frame
void Update () {
if (Target) Attack ();//Если цель есть-атакуем ее
else {
// rotateTo = Quaternion.LookRotation(new Vector3(0,0,0)-transform.position);
TimeNewTar1+=Time.deltaTime;
if (TimeNewTar1>=TimeNewTar) {
TimeNewTar1=0;
if (Random.value>=.5f) TargetTag=Tag1;//Если цели нет выбираем рандомно ее тег ( 50 на 50)
else TargetTag=Tag2;
LockTarget ();
}
}
}
// The angle between dirA and dirB around axis
float AngleAroundAxis (Vector3 dirA ,Vector3 dirB,Vector3 axis) {
// Project A and B onto the plane orthogonal target axis
dirA = dirA - Vector3.Project (dirA, axis);
dirB = dirB - Vector3.Project (dirB, axis);
// Find (positive) angle between A and B
float angle = Vector3.Angle (dirA, dirB);
// Return angle multiplied with 1 or -1
return angle * (Vector3.Dot (axis, Vector3.Cross (dirA, dirB)) < 0 ? -1 : 1);
}
void LateUpdate ()
{
Ugol = AngleAroundAxis(Platforma.transform.forward,Guns.transform.forward,Platforma.transform.right);//Вычисляем угол возвышения
if (Ugol>0) {
LastTimeDisor+=Time.deltaTime;//Цель не в секторе обстрела увеличиваем таймер слежения
Ugol = 0;
Guns.transform.localRotation = Quaternion.Euler(0.0f,0.0f,0.0f);//Вращение только по X и Y
}
if (Ugol<MaxAngle) {
LastTimeDisor+=Time.deltaTime;
Ugol = MaxAngle;
Guns.transform.localRotation = Quaternion.Euler(MaxAngle,0.0f,0.0f);//Вращение только по X и Y
}
}
}
using System.Collections;
public class Turrets : MonoBehaviour {
public GameObject Guns;//Объект орудий
public GameObject PointGun1,PointGun2,PointGun3,PointGun4;//Точки выстрела вешаются на концы орудий
public GameObject Platforma;//Платформа на которой орудия находятся
public GameObject Target;//Цель
public GameObject BulletPref;//Префаб пули
public float MaxAngle;//Угол возвышения орудий
public string Tag1,Tag2;//Тэги целей
public float AgroRadius;//Радиус обнаружения целей
public float DistanceFire;//Дальность стрельбы
public float MaxRot;// Max сила ротации
public float shootSpeed = 1;
public float lastShotTime,LastTimeDisor;
public float TimeDisor;//Время ведения цели до переключения на новую цель в нулевом секторе огня
public float TimeNewTar;//Время до переключения на новую цель
float Ugol,TimeNewTar1;
Quaternion rotateTo1,rotateTo2;
float yRot;
string TargetTag;//тег таргета
private Quaternion ZeroRot; // кватернион нулевой позиций поворота
// Use this for initialization
void Start () {
lastShotTime=0;
}
void LockTarget (){//Поиск и захват цели,цель выбирается Всяко ))
//int Len;//число целей на сцене
float Distanc;//Дистанция до цели
GameObject <img src="./images/smilies/unmarked.gif" alt="[]" title="Запланировано" /> gos;//Массив для целей
gos = GameObject.FindGameObjectsWithTag(TargetTag);//Пишем в массив цели
//if (gos==null) return;//Если пусто-выходим
if (gos.Length==0) return;
if ((TargetTag == "Player") && (gos!=null)) {Target = gos[0];return;}//Если цель игрок то запись в таргет игрока и выход
//Len =(int)(Random.Range(0,gos.Length-1));//Рандомная выборка цели
//Target = gos [Len];
//Debug.Log(gos.Length);
Distanc = Vector3.Distance(transform.position,gos[0].transform.position);//Записываем дистанцию до 1-го ГО
Target = gos[0];//Запись в таргет 1-го ГО
//Выбираем ближнюю цель
foreach (GameObject go in gos){
if (Distanc>Vector3.Distance(transform.position,go.transform.position)){
Distanc=Vector3.Distance(transform.position,go.transform.position);
Target = go;
}
}
if (Vector3.Distance(transform.position,Target.transform.position)>AgroRadius) Target=null;//Если цель далеко вырубаем ее
}
void Attack (){
float Distance = Vector3.Distance(transform.position,Target.transform.position);//Дистанция до цели
Uprejdenie upr = this.gameObject.GetComponent <Uprejdenie> ();//Получаем доступ к скрипту упреждения
upr.Target = Target;//Передаем цель
//upr.pos - получение позиции для стрельбы
Vector3 posit =upr.pos;
if ((Random.value>0.5f)&&(Target.tag=="Player")) posit += new Vector3(0,0,-5);//Даем шанс игроку )))
rotateTo1 = Quaternion.LookRotation(posit - Platforma.transform.position);//Слежение орудий за целью
rotateTo2 = Quaternion.LookRotation(posit - Guns.transform.position);
Platforma.transform.rotation = Quaternion.Slerp(Platforma.transform.rotation,rotateTo1,Time.deltaTime*MaxRot);
Platforma.transform.localRotation = Quaternion.Euler(0.0f,Platforma.transform.localRotation.eulerAngles.y,0.0f);//Врвщение только по y
Guns.transform.rotation = Quaternion.Slerp(Guns.transform.rotation,rotateTo2,Time.deltaTime*MaxRot);
Guns.transform.localRotation = Quaternion.Euler(Guns.transform.localRotation.eulerAngles.x,0.0f,0.0f);//Вращение только по X и Y
{
float Ang = AngleAroundAxis(Guns.transform.forward,posit,Vector3.forward); //Угол между целью и орудиями
if ((Ang>-20)&&(Ang<20)&&(Time.time>(lastShotTime + shootSpeed))&&((Distance)<DistanceFire)&&(Ugol<0)){
if (PointGun1) Instantiate(BulletPref ,PointGun1.transform.position,PointGun1.transform.rotation);
if (PointGun2) Instantiate(BulletPref ,PointGun2.transform.position,PointGun2.transform.rotation);
lastShotTime = Time.time;
LastTimeDisor = 0; //Обнуляем таймер слежения
}
//
}
if (LastTimeDisor>=TimeDisor) Target = null;//Если превысили время слежения в мертвом секторе переключаемся на другую
}
// Update is called once per frame
void Update () {
if (Target) Attack ();//Если цель есть-атакуем ее
else {
// rotateTo = Quaternion.LookRotation(new Vector3(0,0,0)-transform.position);
TimeNewTar1+=Time.deltaTime;
if (TimeNewTar1>=TimeNewTar) {
TimeNewTar1=0;
if (Random.value>=.5f) TargetTag=Tag1;//Если цели нет выбираем рандомно ее тег ( 50 на 50)
else TargetTag=Tag2;
LockTarget ();
}
}
}
// The angle between dirA and dirB around axis
float AngleAroundAxis (Vector3 dirA ,Vector3 dirB,Vector3 axis) {
// Project A and B onto the plane orthogonal target axis
dirA = dirA - Vector3.Project (dirA, axis);
dirB = dirB - Vector3.Project (dirB, axis);
// Find (positive) angle between A and B
float angle = Vector3.Angle (dirA, dirB);
// Return angle multiplied with 1 or -1
return angle * (Vector3.Dot (axis, Vector3.Cross (dirA, dirB)) < 0 ? -1 : 1);
}
void LateUpdate ()
{
Ugol = AngleAroundAxis(Platforma.transform.forward,Guns.transform.forward,Platforma.transform.right);//Вычисляем угол возвышения
if (Ugol>0) {
LastTimeDisor+=Time.deltaTime;//Цель не в секторе обстрела увеличиваем таймер слежения
Ugol = 0;
Guns.transform.localRotation = Quaternion.Euler(0.0f,0.0f,0.0f);//Вращение только по X и Y
}
if (Ugol<MaxAngle) {
LastTimeDisor+=Time.deltaTime;
Ugol = MaxAngle;
Guns.transform.localRotation = Quaternion.Euler(MaxAngle,0.0f,0.0f);//Вращение только по X и Y
}
}
}