Показать сообщение отдельно
Старый 13.09.2010, 21:52   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Самонаводящиеся ракеты

Основываясь на примере ffinder'a я решил написать C# версию скрипта самонаводящейся ракеты:

using UnityEngine;

public class 
HomingMissile : MonoBehaviour
{
    
// цель для ракеты
    
public Transform target;
    
// префаб взрыва
    
public GameObject explosionPrefab;
    
// скорость ракеты
    
public float speed = 10;
    
// скорость поворота ракеты
    
public float turnSpeed = 100;
    
// время до взрыва
    
public float explosionTime = 5;


    
// трансформ текущего объекта для оптимизации обращений к нему
    
private Transform _thisTransform;

    public 
void Awake()
    {
        
_thisTransform = transform;
    }

    public 
void Update()
    {
        
// уменьшаем таймер
        
explosionTime -= Time.deltaTime;

        
// если время таймера истекло, то взрываем ракету
        
if (explosionTime <= 0)
        {
            
Explode();
            return;
        }


        
// величина движения вперед
        
Vector3 movement = _thisTransform.forward * speed * Time.deltaTime;

        
// если указана цель
        
if (target != null)
        {
            
// направление на цель
            
Vector3 direction = target.position - _thisTransform.position;

            
// максимальный угол поворота в текущий кадр
            
float maxAngle = turnSpeed * Time.deltaTime;

            
// угол между направлением на цель и направлением ракеты
            
float angle = Vector3.Angle(_thisTransform.forward, direction);

            if (
angle <= maxAngle)
            {
                
// угол меньше максимального, значит поворачиваем на цель
                
_thisTransform.forward = direction.normalized;
            }
            else
            {
                
//сферическая интерполяция направления с использованием максимального угла поворота
                
_thisTransform.forward = Vector3.Slerp(_thisTransform.forward, direction.normalized, maxAngle / angle);
            }

            
// расстояние до цели
            
float distanceToTarget = direction.magnitude;

            
// если расстояние мало, то создаем взрыв
            
if (distanceToTarget < movement.magnitude)
            {
                
Explode();
                return;
            }
        }

        
// двигамет ракету вперед
        
_thisTransform.position += movement;
    }

    public 
void Explode()
    {
        if (
explosionPrefab != null)
        {
            
Instantiate(explosionPrefab, _thisTransform.position, _thisTransform.rotation);
        }
        
// уничтожаем ракету
        
Destroy(gameObject);
    }

    
// взрываем при коллизии
    
public void OnCollisionEnter()
    {
        
Explode();
    }
} 
__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 14.09.2010 в 02:50.
(Offline)
 
Ответить с цитированием
Эти 8 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
den (14.09.2010), Dream (14.09.2010), Fatalix3d (14.09.2010), h1dd3n (14.09.2010), Illidan (14.09.2010), Mr_F_ (14.09.2010), Nuprahtor (14.09.2010), Данил (14.09.2010)