Синтаксис:
Используется 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;
}
}
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)));
}
}
}
}
}
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)));
}
}
}
}
}