Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class cannon : MonoBehaviour {
Transform target; // цель
public Transform sp;//spawn point (спавн пулей)
public Transform bullet;//пуля
public float attackRange = 30.0f;
public float shootAngleDistance = 10.0f;
public float gundamag = 30;
float _time = 5.0f;
double t = 0.3f;//число для счетчика выстрелов
float objectdefault_y_position = 21.55736f;
void FindClosestEnemy(){
GameObject closest=null;
float distance = 5000f;
foreach(var enemy in Enemy_test_Scrpt.AllEnemies)
{
var diff=(enemy.transform.position-transform.position);
var curDistance=diff.sqrMagnitude;
if(curDistance<distance)
{
closest=enemy;
distance=curDistance;
}
}
target=closest.transform;
}
void Awake(){
}
void Start(){
}
void Update(){
FindClosestEnemy();
//Пушка ищет ближайшую цель
if (target == null) //если не нашла то ретурн
return;
//повороачиваем пушку к цели
var targetPoint = target.position;
var targetRotation = Quaternion.LookRotation (targetPoint - transform.position, Vector3.up);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 4.0f);
var forward = transform.TransformDirection(Vector3.forward);
var targetDir = target.position - transform.position;
////повороачиваем пушку к цели
RaycastHit hit;
if(Physics.Raycast(transform.position,transform.forward,out hit,200f)){//стрельба
//Debug.DrawLine( transform.position, target.position, Color.red);
Pause ();//пауза
if(t>=0.5){//ждем пока счетчик обнулится
if(hit.transform.gameObject.layer!=4){
hit.transform.gameObject.GetComponent<Enemy_test_Scrpt>().target_health-=gundamag;
}
t=0.3;//счетчик выстрела обнуляем
}
}//DrawScript
}
void Pause(){//пауза
if(t<0.5){
t+=Time.deltaTime*(1.0/_time);
}
}
}
using System.Collections;
using System.Collections.Generic;
public class cannon : MonoBehaviour {
Transform target; // цель
public Transform sp;//spawn point (спавн пулей)
public Transform bullet;//пуля
public float attackRange = 30.0f;
public float shootAngleDistance = 10.0f;
public float gundamag = 30;
float _time = 5.0f;
double t = 0.3f;//число для счетчика выстрелов
float objectdefault_y_position = 21.55736f;
void FindClosestEnemy(){
GameObject closest=null;
float distance = 5000f;
foreach(var enemy in Enemy_test_Scrpt.AllEnemies)
{
var diff=(enemy.transform.position-transform.position);
var curDistance=diff.sqrMagnitude;
if(curDistance<distance)
{
closest=enemy;
distance=curDistance;
}
}
target=closest.transform;
}
void Awake(){
}
void Start(){
}
void Update(){
FindClosestEnemy();
//Пушка ищет ближайшую цель
if (target == null) //если не нашла то ретурн
return;
//повороачиваем пушку к цели
var targetPoint = target.position;
var targetRotation = Quaternion.LookRotation (targetPoint - transform.position, Vector3.up);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 4.0f);
var forward = transform.TransformDirection(Vector3.forward);
var targetDir = target.position - transform.position;
////повороачиваем пушку к цели
RaycastHit hit;
if(Physics.Raycast(transform.position,transform.forward,out hit,200f)){//стрельба
//Debug.DrawLine( transform.position, target.position, Color.red);
Pause ();//пауза
if(t>=0.5){//ждем пока счетчик обнулится
if(hit.transform.gameObject.layer!=4){
hit.transform.gameObject.GetComponent<Enemy_test_Scrpt>().target_health-=gundamag;
}
t=0.3;//счетчик выстрела обнуляем
}
}//DrawScript
}
void Pause(){//пауза
if(t<0.5){
t+=Time.deltaTime*(1.0/_time);
}
}
}
Также есть скрипт цели:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Enemy_test_Scrpt : MonoBehaviour {
public float target_health=100;
public GameObject target_follow;
public static List<GameObject> AllEnemies = new List<GameObject>();
void Awake()
{
AllEnemies.Add(gameObject);
}
void OnDestroy()
{
AllEnemies.Remove(gameObject);
}
void Start () {
}
void Update () {
if(target_health<=0){
Destroy(transform.gameObject);
Destroy(target_follow);
}
}
}
using System.Collections;
using System.Collections.Generic;
public class Enemy_test_Scrpt : MonoBehaviour {
public float target_health=100;
public GameObject target_follow;
public static List<GameObject> AllEnemies = new List<GameObject>();
void Awake()
{
AllEnemies.Add(gameObject);
}
void OnDestroy()
{
AllEnemies.Remove(gameObject);
}
void Start () {
}
void Update () {
if(target_health<=0){
Destroy(transform.gameObject);
Destroy(target_follow);
}
}
}
Проблема заключается в том что функция FindClosestEnemy() жрет огромное количество фпс, если разместить ее в update(), а если функцию поместить в awake() или start() , то пушка ищет только одну цель(а они появляются во время игры(instantiate)) , как быть подскажите - буду премного благодарен