Космическая леталка

Проекты в стадии разработки.

Re: Космическая леталка

Сообщение silver516 10 ноя 2010, 22:31

А скрипт турели не продемонстрируете? (если не секрет конечно)
Аватара пользователя
silver516
UNIт
 
Сообщения: 78
Зарегистрирован: 10 мар 2010, 16:03

Re: Космическая леталка

Сообщение Paul Siberdt 10 ноя 2010, 23:00

Грубо выдираю из контекста... :)
Y - вертикальная ось
башня и орудие смотрят в +Z

Вектор _target - конечная точка прицеливания, это или координаты цели, или точка motion prediction, что считается отдельно.

Прелесть функций в том, что они работают независимо от ориентации турели в пространстве.


Синтаксис:
Используется javascript
// вызываем функцию, когда надо повернуть только башню..
// _tracking - скорость поворота (градусов в секунду)
function TrackTurret ( _turret : Transform,  _target : Vector3, _tracking : float ){
        TrackTurret( _turret, null, _target, _tracking, 0.0 );
}
// вызываем функцию, когда надо повернуть башню и орудие..
// _tracking - скорость поворота (градусов в секунду)
// _limit - ограничение отклонения орудия (градусы)
function TrackTurret ( _turret : Transform, _gun : Transform, _target : Vector3, _tracking : float, _limit : float ){
       
        var vTargetPosLocal : Vector3 = _turret.InverseTransformPoint(_target);        
        vTargetPosLocal.y = 0.0;       
        var angle : float = Vector3.Angle(vTargetPosLocal, Vector3.forward);

        if ( angle < 10 && _gun ) TrackGun(_gun, _target, _tracking * 2, _limit );
       
        _tracking *= Global.gameTimeScale * Time.deltaTime;
        if ( angle > 0.1 ) {
                if ( angle > _tracking ) _turret.localEulerAngles.y += Mathf.Sign(vTargetPosLocal.x) * _tracking;
                else  _turret.localEulerAngles.y += Mathf.Sign(vTargetPosLocal.x) * angle;
        }
}

// вызываем функцию, когда надо повернуть орудие..
// _tracking - скорость поворота (градусов в секунду)
// _limit - ограничение отклонения орудия (градусы)
function TrackGun ( _gun : Transform, _target : Vector3, _tracking : float, _limit : float ){
        var     vTargetPosLocal : Vector3 = _gun.InverseTransformPoint(_target);
        vTargetPosLocal.x = 0.0;       

        var angle : float = Vector3.Angle(vTargetPosLocal, Vector3.forward);
        var angle_res : float = _gun.localEulerAngles.x;
       
        _tracking *= Global.gameTimeScale * Time.deltaTime;

        if ( angle > 0.1 ) {
                if ( angle > _tracking ) angle_res -= Mathf.Sign(vTargetPosLocal.y) * _tracking;
                else  angle_res -= Mathf.Sign(vTargetPosLocal.y) * angle;
                if(Mathf.Cos(angle_res * Mathf.Deg2Rad) > Mathf.Cos( _limit * Mathf.Deg2Rad )) _gun.localEulerAngles.x = angle_res;
        }
}


... окинул свежим взглядом и заметил несколько глупостей... ну да ладно, я дал обет "Никакого рефакторинга до релиза!" :D
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Космическая леталка

Сообщение Phoenics 11 ноя 2010, 01:16

silver516 писал(а):А скрипт турели не продемонстрируете? (если не секрет конечно)


Пожалуйста

Код: Выделить всё
using UnityEngine;
using System.Collections;

public class CannonController : MonoBehaviour {
   public Transform WeaponSlotObject;
   CannonSlotController Slot;
   public Transform PitchController;
   public Transform YawController;
   private float CurPitch = 0.0f;
   private float CurYaw = 0.0f;
   public float YawSpeed = 90.0f;
   public float PitchSpeed = 90.0f;
   public bool canPitch = false;
   public bool canYaw = false;
   private bool canFire = false;
   public IGameLogicObject Target;
   private IShootingController ShootControl;
   public float ShotingDeltaAngle = 1.0f;
   private TargetAimPredicator itsAimPredicator;
   public LayerMask EnemyLayers;
   private Transform Gun;
   public float AreaRadiusKoef = 1.0f;
   public AudioSource PitchRotateSound;
   public AudioSource YawRotateSound;
   
   //for debug
   //public Vector3 AimPos;
   
   // Use this for initialization
   void Start () {
      Slot = WeaponSlotObject.gameObject.GetComponent<CannonSlotController>();
      /*if (PitchController)
         canPitch = true;
      if (YawController)
         canYaw = true;*/
      ShootControl = gameObject.GetComponentInChildren<IShootingController>();
      if (!ShootControl)
         Debug.Log("NO SHOOT CONTROLLER!");
      Gun = ShootControl.Guns[0].Gun;
      if (!Gun)
         Debug.Log("No gun set!");
      itsAimPredicator = new TargetAimPredicator();
   }
   
   // Update is called once per frame
   void Update () {
      if (!Target || Target.GetHP()<=0) // no target or target kill
      {
         ShootControl.SetCanFire(false, Vector3.zero, 5.0f, 0.0f);
         SelectNewTarget();
         return;
      }
      Vector3 Pos = Target.GetPosition();
      if (itsAimPredicator.CanPredicate())
      {
         Pos = itsAimPredicator.AimPredicate();
      }
      canFire = Slot.isInSector(ref Slot.Sector, Pos);
      //Debug.Log("can fine: "+canFire);
      if (!canFire) // target not in sector
      {
         ShootControl.SetCanFire(false, Vector3.zero, 5.0f, 0.0f);
         SelectNewTarget();
         return;
      }
      
      // рысканье
      if (canYaw)
      {
         Vector3 LocalYawPos = YawController.InverseTransformPoint(Pos);
         float YawAngle = Mathf.Atan2(LocalYawPos.x, LocalYawPos.z) * Mathf.Rad2Deg;
         if (YawRotateSound)
         {
            if (YawAngle>0.5f)
               YawRotateSound.Play();
            else
               YawRotateSound.Stop();
         }
         //float CurYawAngle = YawAngle * Time.deltaTime;
         float AbsCurYaw = Mathf.Abs(YawAngle);
         float ResultAngle = 0.0f;
         if (AbsCurYaw<YawSpeed*Time.deltaTime)
            ResultAngle = YawAngle;
         else
            ResultAngle = Mathf.Sign(YawAngle) * YawSpeed*Time.deltaTime;
         CurYaw += ResultAngle;
         YawController.Rotate(0.0f, ResultAngle, 0.0f);
      }
      
      // тангаж
      Vector3 LocalPitchPos = PitchController.InverseTransformPoint(Pos);
      if(canPitch)
      {
         float PitchAngle = -Mathf.Atan2(LocalPitchPos.y, LocalPitchPos.z) * Mathf.Rad2Deg;
         if(PitchRotateSound)
         {
            if (PitchAngle>0.5f)
               PitchRotateSound.Play();
            else
               PitchRotateSound.Stop();
         }
         //float CurPitchAngle = PitchAngle * Time.deltaTime;
         float AbsCurPitch = Mathf.Abs(PitchAngle);
         float ResultAngle = 0.0f;
         if (AbsCurPitch<PitchSpeed*Time.deltaTime)
            ResultAngle = PitchAngle;
         else
            ResultAngle = Mathf.Sign(PitchAngle) * PitchSpeed*Time.deltaTime;
         CurPitch += ResultAngle;
         PitchController.Rotate(ResultAngle, 0.0f, 0.0f);
      }
      
      float AngleToTarget = Vector3.Angle(LocalPitchPos, Vector3.forward);
      //Debug.Log("in sector: "+canFire+", angle: "+AngleToTarget+", distance: "+(Pos-transform.position).magnitude+", target: "+Target.GetPosition()+", aim: "+Pos);
      if (AngleToTarget < ShotingDeltaAngle)
         ShootControl.SetCanFire(true, Pos-transform.position, Target.GetSphereSize() * Target.GetSpeedPercent() * AreaRadiusKoef, itsAimPredicator.LastPredicatedTime());
      else
         ShootControl.SetCanFire(false, Pos-transform.position, Target.GetSphereSize() * Target.GetSpeedPercent() * AreaRadiusKoef, itsAimPredicator.LastPredicatedTime());
   }
   
   void SetNewTarget(IGameLogicObject target)
   {
      //Debug.Log(target.gameObject.name);
      itsAimPredicator.UpdatePredicator(Gun, target, ShootControl.BulletVelocity);
   }
   
   void SelectNewTarget()
   {
      float MaxDistance = ShootControl.ShotingRange;
      Collider [] clds = Physics.OverlapSphere(transform.position, MaxDistance, EnemyLayers);
      MaxDistance = MaxDistance * MaxDistance;
      //Debug.Log(clds.GetLength(0));
      foreach(Collider c in clds)
      {
         IGameLogicObject obj = c.gameObject.GetComponent<IGameLogicObject>();
         if (obj)
         {
            float WorkDistance = (obj.GetPosition() - transform.position).sqrMagnitude;
            if (MaxDistance>WorkDistance && obj.GetHP()>0)
            {
               MaxDistance = WorkDistance;
               Target = obj;
            }
         }
      }
      if (Target)
      {
         SetNewTarget(Target);
      }
   }
}
Аватара пользователя
Phoenics
UNIт
 
Сообщения: 60
Зарегистрирован: 31 окт 2010, 22:29

Re: Космическая леталка

Сообщение Pchelovod 11 ноя 2010, 08:34

Интересно, а почему именно эти разрывы выглядят диковато? Когда кораблик взорвался ничего, а снаряд взорвался диковато? :-?
Ну дык, космос. Для процесса горения, как мне помнится, нужен кислород, в кораблике для кратковременной вспышки он есть. А в снаряде откуда?
Хотя, хозяин барин. Смотрится симпатично :)
Pchelovod
UNIт
 
Сообщения: 73
Зарегистрирован: 13 окт 2009, 08:13
Откуда: Украина (Донецк)

Re: Космическая леталка

Сообщение Neodrop 11 ноя 2010, 09:16

Для процесса горения кислород не нужен. Нужен любой окислитель. (popcorn)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Космическая леталка

Сообщение silver516 11 ноя 2010, 09:27

Спасибо, ща свои турели переберу на предмет оптимизации.
Аватара пользователя
silver516
UNIт
 
Сообщения: 78
Зарегистрирован: 10 мар 2010, 16:03

Re: Космическая леталка

Сообщение Pchelovod 11 ноя 2010, 11:47

:-? про окислитель забыл (плохо слушал на уроках)
Pchelovod
UNIт
 
Сообщения: 73
Зарегистрирован: 13 окт 2009, 08:13
Откуда: Украина (Донецк)

Re: Космическая леталка

Сообщение Buranek 12 ноя 2010, 12:48

Класс игруха! Думаю, что в будующем будет ещё круче!
Аватара пользователя
Buranek
UNIт
 
Сообщения: 73
Зарегистрирован: 10 окт 2009, 19:33
Откуда: РФ
  • Сайт

Пред.

Вернуться в Кузня

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6