Помогити передерать в Ai

Форум для всего, что связано с ИИ.

Помогити передерать в Ai

Сообщение 3axap_Ukraine 15 ноя 2015, 12:34

Привет.Я делал Стратегию у меня есть самолет но он толька под моим командиониим .как сделать штоби он атакавал, патрулив? Вот Скрипт:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class AIRMovement : MonoBehaviour {
       
        public float cruisingAltitude = 4.0f;
        public float firingRange = 10.0f;
        public int maxAmmo = 2;
        private int currentAmmo;
        public float reloadSpeed = 5.0f;
        public float speed = 10.0f;
        public float takeOffSpeed = 10.0f;
        public float acceleration = 4.0f;
        public float bankAngle = 5;
        public float bankAcceleration = 1.0f;
        public float bankForce = 100.0f;
        public float landingAngle = 15.0f;
        public float altitudeRateOfChange = 4.0f;
       
        public float captureRadius = 0.5f;
        public float homeCaptureRadius = 8.0f;
       
        private float currentSpeed = 0;
        private float currentBankAngle = 0;
        private float currentLandingAngle = 0;
       
        public bool attacking = false;
        public bool hasAmmo = true;
        public bool hasTarget = false;
        public bool atHome = true;
        public bool takeOff = false;
        public bool landing = false;
        public bool flying = false;
       
        private Vector3 target;
        private Vector3 targetDistanceCheck;
        private GameObject home;
        private Vector3 targetHome;
       
        private GameObject[] vapourTrails = new GameObject[2];
        private Transform[] fans = new Transform[2];
        private float fanSpeed = 0;
       
        public bool hasFans = true;
       
        public float maxFanSpeed = 20;
        public float fanAcceleration = 10;
       
        private GameObject targetToAttack;
       
        private float currentAltitude;
        private float targetAltitude;
        private float timer = 0;
        private float timeToRotate;
       
        private float approachSpeed;
       
        private float angleToTarget;
        private Vector3 targetDir;
       
        public TrailRenderer[] trails;
        public ParticleRenderer engine;
        private float[] emitSpeed = new float[2];
       
        private float bankRadius;
        private float stuckTimer = 0;
        private bool checkStuck = false;
       
        public float bombPosX=1, bombPosZ= 1;
       
        public GameObject[] bombs = new GameObject[2];
       
        public float reloadTimer = 10;
       
        private bool returnAttack = false;
        private float returnTimer = 0;
        public float returnAttackDelay = 2;
       
       
        // Use this for initialization
        void Start ()
        {
                currentAmmo = maxAmmo;
                approachSpeed = speed*0.15f;
                trails = GetComponentsInChildren<TrailRenderer>();
                engine = GetComponentInChildren<ParticleRenderer>();
                if (hasFans)
                {
                        fans[0] = transform.FindChild ("lFan");
                        fans[1] = transform.FindChild ("rFan");
                }
               
                bankRadius = 360/bankForce;
               
                emitSpeed[0] = engine.particleEmitter.minEmission;
                emitSpeed[1] = engine.particleEmitter.maxEmission;
               
                engine.particleEmitter.minEmission = 0;
                engine.particleEmitter.maxEmission = 0;
               
                loadMissile (0);
                loadMissile (1);
        }
       
        // Update is called once per frame
        void Update ()
        {
                timer += Time.deltaTime;
               
                if (checkStuck) stuckTimer += Time.deltaTime;
               

                //Trail stuff
                if (flying)
                {
                        foreach (TrailRenderer t in trails)
                        {
                                t.enabled = true;
                                //t.time = 2;
                        }
                       
                        //engine.particleEmitter.emit = true;          
                       
                        if (engine.particleEmitter.minEmission < emitSpeed[0])
                        {
                                engine.particleEmitter.minEmission += 4;
                                engine.particleEmitter.maxEmission += 4;
                        }
                        else
                        {
                                engine.particleEmitter.minEmission = emitSpeed[0];
                                engine.particleEmitter.maxEmission = emitSpeed[1];
                        }
                       
                }
                else
                {
                        foreach (TrailRenderer t in trails)
                        {
                                t.enabled = false;
                                //t.time = 0;
                        }
                       
                        //engine.enabled = false;
                        //engine.particleEmitter.emit = false;
                        engine.particleEmitter.minEmission -= 1;
                        engine.particleEmitter.maxEmission -= 1;
                       
                        if (engine.particleEmitter.minEmission < 0.5f)
                        {
                                engine.particleEmitter.minEmission = 0;
                                engine.particleEmitter.maxEmission = 0;
                        }
                }
               
                //Anim stuff
                if (hasFans && atHome)
                {
                        fanSpeed -= fanAcceleration*Time.deltaTime;
                        if (fanSpeed < 0)
                        {
                                fanSpeed = 0;
                        }
                       
                        fans[0].Rotate (new Vector3(0, fanSpeed, 0));
                        fans[1].Rotate (new Vector3(0, -fanSpeed, 0));
                }
                else if (hasFans)
                {
                        fanSpeed += fanAcceleration*Time.deltaTime;
                        if (fanSpeed > maxFanSpeed)
                        {
                                fanSpeed = maxFanSpeed;
                        }
                       
                        fans[0].Rotate (new Vector3(0, fanSpeed, 0));
                        fans[1].Rotate (new Vector3(0, -fanSpeed, 0));
                }
               
                //Update current altitude
                //currentAltitude = Mathf.Max (transform.position.y - Terrain.activeTerrain.SampleHeight (transform.position), transform.position.y-grid.mGrid.waterLevel);
                currentAltitude = transform.position.y;
                targetAltitude = Mathf.Max (Terrain.activeTerrain.SampleHeight (transform.position) + cruisingAltitude, cruisingAltitude);
               
                if (atHome)
                {
                        //Plane is at home, reload
                        if (currentAmmo < maxAmmo)
                        {
                                reloadTimer += Time.deltaTime;
                               
                                if (reloadTimer >= reloadSpeed)
                                {
                                        reloadTimer = 0;
                                       
                                        loadMissile (currentAmmo);

                                        currentAmmo++;
                                       
                                }
                        }
                       
                        //Given a target
                        if (hasTarget)
                        {
                                takeOff = true;
                                atHome = false;
                                gameObject.layer = 14;
                        }
                       
                        currentSpeed = 0;              
                }
                else if (takeOff && fanSpeed > maxFanSpeed*0.9f)
                {
                        if (currentAltitude < targetAltitude)
                        {
                                transform.Translate (new Vector3(0, takeOffSpeed*Time.deltaTime, 0), Space.World);                             
                        }
                        else
                        {
                                takeOff = false;
                                flying = true;
                        }
                }
                else if (landing)
                {
                        if (hasTarget)
                        {
                                landing = false;
                                takeOff = true;
                        }
                       
                        //Calculate angleToTarget
                        targetDir = targetHome - transform.position;
                        targetDir.y = 0;
                       
                        Vector3 forwardDir = transform.forward;
                        forwardDir.y = 0;
                       
                        angleToTarget = Vector3.Angle (forwardDir, targetDir);
                        if (Vector3.Cross (forwardDir, targetDir).y < 0) angleToTarget *= -1;
                       
                        if (angleToTarget > -2 && angleToTarget < 2)
                        {
                               
                                //Good to land
                                //Calculate correct speed
                                if (currentSpeed > approachSpeed)
                                {
                                        currentSpeed -= acceleration*Time.deltaTime*1.5f;
                                }      
                               
                                //Lock on
                                transform.LookAt (new Vector3(targetHome.x, transform.position.y, targetHome.z));
                               
                                if (Vector3.Distance (transform.position, new Vector3(targetHome.x, transform.position.y, targetHome.z)) < captureRadius)
                                {
                                        transform.Translate (new Vector3(0, -takeOffSpeed*Time.deltaTime, 0), Space.Self);
                                        transform.position = Vector3.Lerp (transform.position, new Vector3(targetHome.x, transform.position.y, targetHome.z), Time.deltaTime*4);
                                       
                                        if (Vector3.Distance (transform.position, targetHome) < captureRadius/2)
                                        {
                                                landing = false;
                                                atHome = true;
                                                gameObject.layer = 8;
                                        }
                                }
                                else
                                {
                                        transform.Translate (new Vector3(0, 0, currentSpeed*Time.deltaTime), Space.Self);                                      
                                }
                        }
                        else
                        {
                                //Need to get another runup
                                //Probably set target somewhere else
                                setTarget(transform.position + (transform.forward*15), false);
                                landing = false;
                                flying = true;
                        }
                }
                else if (flying)
                {
                        //If just attacked and unit still exists need to fly forward then re-engage
                        if (returnAttack && targetToAttack != null)
                        {
                                returnTimer += Time.deltaTime;
                               
                                if (returnTimer > returnAttackDelay)
                                {
                                        setTarget (targetToAttack, true);
                                        returnAttack = false;
                                }
                        }
                        //If just attacked and unit has been destroyed
                        else if (returnAttack)
                        {
                                target = targetHome;
                                attacking = false;
                                hasTarget = false;
                                returnAttack = false;
                        }
                       
                       
                        //Check to see if we are at destination?
                        if (hasTarget && !attacking)
                        {
                               
                                Vector3 tTemp = new Vector3(target.x, transform.position.y, target.z);
                                if (Vector3.Distance (transform.position, tTemp) <= captureRadius)
                                {                                      
                                        hasTarget = false;
                                }                              
                        }
                        else if (hasTarget && attacking)
                        {
                                //Target we're attacking has been destroyed
                                if (targetToAttack == null)
                                {
                                        target = targetHome;
                                        attacking = false;
                                        hasTarget = false;                                     
                                }
                                else
                                {
                                target = targetToAttack.transform.position;
                                Vector3 tTemp = new Vector3(target.x, transform.position.y, target.z);
                                if (Vector3.Distance (transform.position, tTemp) <= firingRange)
                                {
                                        dropBombs ();
                                        if (currentAmmo > 0)
                                        {
                                                returnAttack = true;
                                                returnTimer = 0;
                                                setTarget (transform.position+(transform.forward*150), false, true);
                                        }
                                        else
                                        {
                                                attacking = false;
                                                hasTarget = false;
                                                returnAttack = false;                                          
                                        }                                      
                                }
                                }
                        }
                        else
                        {
                                target = targetHome;
                                Vector3 tTemp = new Vector3(targetHome.x, transform.position.y, targetHome.z);
                                if (Vector3.Distance (transform.position, tTemp) <= homeCaptureRadius)
                                {
                                        landing = true;
                                        flying = false;
                                }
                        }
                       
                        //Update Speed
                        if (currentSpeed < speed)
                        {
                                currentSpeed += acceleration*Time.deltaTime;
                        }
                       
                        //Find angle to target
                        if (hasTarget)
                        {
                                targetDir = target-transform.position;
                                targetDir.y = 0;
                                angleToTarget = Vector3.Angle (transform.forward, targetDir);
                                if (Vector3.Cross (transform.forward, targetDir).y < 0) angleToTarget *= -1;
                        }
                        else
                        {
                                targetDir = targetHome-transform.position;
                                targetDir.y = 0;
                                angleToTarget = Vector3.Angle (transform.forward, targetDir);
                                if (Vector3.Cross (transform.forward, targetDir).y < 0) angleToTarget *= -1;
                        }
                       
                        checkStuck = false;
                        //Does the plane need to change course?
                        if (angleToTarget < -2)
                        {
                                //Change course
                                if (currentBankAngle < bankAngle) currentBankAngle += bankAcceleration*Time.deltaTime;
                                //transform.localEulerAngles = Vector3.Lerp (transform.localEulerAngles, new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, bankAngle), Time.deltaTime*bankAcceleration);                         
                                transform.Rotate (new Vector3(0,-bankForce*Time.deltaTime,0), Space.World);
                                checkStuck = true;
                        }
                        else if (angleToTarget > 2)
                        {
                                if (currentBankAngle > -bankAngle) currentBankAngle -= bankAcceleration*Time.deltaTime;
                                //transform.localEulerAngles = Vector3.Lerp (transform.localEulerAngles, new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, -bankAngle), Time.deltaTime*bankAcceleration);                        
                                transform.Rotate (new Vector3(0,bankForce*Time.deltaTime,0), Space.World);
                                checkStuck = true;
                        }
                        else
                        {
                                //Level out
                                if (currentBankAngle < 0)
                                {
                                        currentBankAngle += bankAcceleration*Time.deltaTime;
                                }
                                else if (currentBankAngle > 0)
                                {
                                        currentBankAngle -= bankAcceleration*Time.deltaTime;
                                }
                               
                                transform.LookAt (new Vector3(target.x, transform.position.y, target.z));
                        }
                       
                        //Need to check if we are constantly circling the unit
                        if (checkStuck)
                        {
                                if (stuckTimer > 3)
                                {
                                        setTarget (transform.position+(transform.forward*15), false);
                                        stuckTimer = 0;
                                       
                                }
                        }
                        else
                        {
                                stuckTimer = 0;
                        }
                       
                        //Update altitude
                        transform.position = Vector3.Slerp (transform.position, new Vector3(transform.position.x, targetAltitude, transform.position.z), Time.deltaTime*altitudeRateOfChange);
                       
                       
                        //Update Bank angle
                        transform.localEulerAngles = new Vector3(0, transform.localEulerAngles.y, currentBankAngle);
                       
                        //Travel forward
                        transform.Translate (new Vector3(0, 0, currentSpeed*Time.deltaTime), Space.Self);
                }      
               
                //Debug.Log (currentAltitude + " " + targetAltitude);
        }
       
        public void setTarget(Vector3 t, bool a)
        {
                target = t;
                attacking = a;
                hasTarget = true;
                returnAttack = false;
        }
       
        public void setTarget(Vector3 t, bool a, bool r)
        {
                target = t;
                attacking = a;
                hasTarget = true;
        }
       
        public void setTarget(GameObject t, bool a)
        {
                if (currentAmmo > 0)
                {                      
                        target = t.transform.position;
                        targetToAttack = t;
                        attacking = a;
                        hasTarget = true;
                        returnAttack = false;
                }
        }
       
        public void stop()
        {
                hasTarget = false;
                attacking = false;
                target = home.transform.position;
        }
       
        public void setHome(GameObject g, Vector3 tH)
        {
                home = g;
                targetHome = tH;
                transform.position = tH;
        }
       
        public GameObject getHome()
        {
                return home;
        }
       
        private void calculateTimeLeft(bool takeOff)
        {
                timer = 0;
                float dist;
                if (takeOff)
                {
                        dist = targetAltitude - currentAltitude;
                }
                else
                {
                        dist = transform.position.y - home.transform.position.y;
                }
               
                timeToRotate = (dist/takeOffSpeed)*0.9f;
        }
       
        private void dropBombs()
        {
                bombs[currentAmmo-1].GetComponent<missileTrajectory>().fire (targetToAttack.transform.position);
                currentAmmo--;

        }
       
        void OnDestroy()
        {
               
        }
       
        private void loadMissile(int n)
        {
                GameObject bTemp = (GameObject)Instantiate (Resources.Load ("models/GRI/units/air/air1/bomb1", typeof(GameObject)), transform.position, transform.rotation);           
                bTemp.transform.parent = this.transform;
                bombs[n] = bTemp;
               
                if (n == 0)
                {
                        bTemp.transform.Translate (new Vector3(bombPosX, 0, -bombPosZ), Space.Self);
                }
                else
                {
                        bTemp.transform.Translate (new Vector3(-bombPosX, 0, -bombPosZ), Space.Self);
                }
        }
       
        public bool isFlying()
        {
                return !atHome;
        }
       
        public bool isAttacking()
        {
                return attacking;
        }
       
        public Vector3 getTarget()
        {
                return target;
        }
       
        public GameObject getTargetUnit()
        {
                return targetToAttack;
        }
}
 

И на ракету:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class missileTrajectory : MonoBehaviour {
       
        public float speed = 30;
        public float captureRadius = 0.5f;
        private bool fired = false;
        private Vector3 target;
       
        public float damage = 100;
        public float impactRadius = 10;
       
        public GameObject explosion;
       
        private bool isQuitting = false;

        // Use this for initialization
        void Start ()
        {
                isQuitting = false;
        }
       
        // Update is called once per frame
        void Update ()
        {
                if (fired)
                {
                        transform.Translate (new Vector3(0,0,speed*Time.deltaTime));
                }
               
                if (Vector3.Distance (transform.position, target) < captureRadius)
                {
                        Destroy (this.gameObject);
                }
        }
       
        public void fire(Vector3 v)
        {
                transform.parent = null;
                target = v;
                transform.LookAt (v);
                fired = true;
        }
       
        void OnApplicationQuit()
        {
                isQuitting = true;
        }
       
        void OnDestroy()
        {
                if (!isQuitting)
                {
                        Instantiate (explosion, transform.position, transform.rotation);
                        Collider[] unitsToDamage = Physics.OverlapSphere(transform.position, impactRadius, 1 << 9 | 1 << 13);
                        foreach (Collider c in unitsToDamage)
                        {
                                float dist = Vector3.Distance (transform.position, c.transform.position);
                                if (c.gameObject.layer == 9)
                                {
                                        //c.gameObject.GetComponent<health>().Damage ((int)(damage/(dist+1)));
                                }

                        }
                }
        }
}
3axap_Ukraine
UNец
 
Сообщения: 10
Зарегистрирован: 06 мар 2015, 15:56

Вернуться в Искуственный Интеллект

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

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