var healthScaleX:float=1.0;
var healthScaleY:float=0.5;
var healthPositionY:float=10.0;
var icon :Texture;
var carcass : GameObject;
var heart = 100;
var minDistanceToTarget :float;
var maxDistanceToTarget :float;
var moveToTarget : boolean = false;
private var incoreMoveToTarget : boolean = false;
private var incoreTarget:GameObject;
var distanseStopToTarget : float=20;
var targetPosition : Vector3;
private var turretRotationForce = 83.5; // 53.5
private var barrelRotationForce = 43.5; // 53.5
private var barrelMinRotation = 20.0;
private var barrelMaxRotation = 330.0;
private var rotationForce = 1.1; // 2.5
private var targetReachedRadius : float = 2.0;
private var maxEngineForce : float = 10.0;// 14.0
private var engineForce : float = 0.0;
private var pitchForce : float = 0.0;
private var accelerationForce : float = 6.0; // 9.0
private var brakeForce : float = 20.0;
private var distanceToDestiantion : float = 0.0;
private var moveMode : MoveModeType = MoveModeType.STOP;
private var maximumFireRange = 80.0;
private var maximumEnemyDetectionRange = 130.0; // TODO HIER WEITERMACHEN MIT ENEMY SCANNING!
private var terrainLayerMask = 1 << 9;
private var nonTerrainLayerMask = ~terrainLayerMask;
var turret : GameObject;
var target : GameObject;
var barrel : GameObject;
var gunMuzzlePoint : GameObject;
// projectiles
var mainGunProjectile : Rigidbody;
var isSelected : boolean = false;
var healthBarPrefab : GameObject;
private var healthBar : GameObject;
// Skidmarks object
var skidmarks : Skidmarks;
public var lastSkidMark : int = -1;
enum MoveModeType {
STOP = 1,
FORWARD = 2
};
function Start() {
//print("Tank start called...");
var go : GameObject = GameObject.Find("UnitManager");
go.SendMessage("AddUnit", gameObject);
healthBar = Instantiate(healthBarPrefab, transform.position, Quaternion.identity);
healthBar.transform.parent = gameObject.transform;
healthBar.transform.position.y += healthPositionY;
healthBar.transform.localScale+=Vector2(healthScaleX,healthScaleY);
SetUnitSelected(true);
//find skidmark object
//var skidmarks : Skidmarks = GameObject.Find("Skidmarks").GetComponent(Skidmarks);
skidmarks = GameObject.FindObjectOfType(Skidmarks);
skidmarks.TestSkidmarks();
//(Skidmarks)
}
function Update () {
if(incoreMoveToTarget==true){incoreTarget=target;}
if(incoreTarget==null){poiskEnemy();}
//poiskEnemy();
if (moveToTarget) {
var rotation = Quaternion.LookRotation(targetPosition - transform.position);
str = Mathf.Min (rotationForce * Time.deltaTime, 1);
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, str);
// Check direction angle. If greater than 60В° then first turn without moving, otherwise full throttle ahead.
var targetDir = targetPosition - transform.position;
var forward = transform.forward;
var angle = Vector3.Angle(targetDir, forward);
if (angle > 60.0) {
moveMode = MoveModeType.STOP;
} else {
moveMode = MoveModeType.FORWARD;
}
// Add tank tracks
//lastSkidMark = skidmarks.AddSkidMark(rigidbody.position, rigidbody.rotation.eulerAngles, 1, lastSkidMark);
// check the distance
distanceToDestiantion = Vector3.Distance(targetPosition, transform.position);
//print ("Distance to other: " + dist);
///////////////////////////////////////////////////////////////////////////
if(incoreMoveToTarget==true){targetReachedRadius=distanseStopToTarget;}else{targetReachedRadius=2.0;}
///////////////////////////////////////////////////////////////////////////
if (distanceToDestiantion < targetReachedRadius) {
moveMode = MoveModeType.STOP;
moveToTarget = false;
distanceToDestiantion = 0.0;
incoreMoveToTarget=false;
}
}
// If enemy is set, turn turret
if (target) {
// Rotation (Yaw) of the turret
var targetVectorTurret : Vector3 = target.transform.position - turret.transform.position;
var localTurretHeading : Vector3 = turret.transform.InverseTransformDirection(targetVectorTurret);
var requiredYaw : float = Mathf.Rad2Deg * Mathf.Atan2(localTurretHeading.x, localTurretHeading.z);
//var requiredPitch : float = Vector3.Angle(Vector3.up, localTurretHeading) - 90.0;
//var deltaYaw = (requiredYaw / 10) * turretRotationForce * Time.deltaTime;
//deltaYaw = Mathf.Clamp(deltaYaw, -2.0, 2.0);
var deltaYaw = Mathf.Clamp((requiredYaw / 10) * turretRotationForce, -45.0, 45.0) * Time.deltaTime;
turret.transform.Rotate(Vector3.up, deltaYaw, Space.Self);
// Pitch of the barrel
var targetVectorBarrel : Vector3 = target.transform.position - barrel.transform.position;
var localBarrelHeading : Vector3 = barrel.transform.InverseTransformDirection(targetVectorBarrel);
var requiredPitch : float = Vector3.Angle(Vector3.up, localBarrelHeading) - 90.0;
var deltaPitch = Mathf.Clamp((requiredPitch / 10) * barrelRotationForce, -45.0, 45.0) * Time.deltaTime;
//print("requiredPitch: " + requiredPitch + " barrel.x: " + barrel.transform.localEulerAngles.x + " " + deltaPitch);
//if (barrel.transform.localEulerAngles.x > 20 && barrel.transform.localEulerAngles.x < 340) {
// deltaPitch = 0;
//}
barrel.transform.Rotate(Vector3.right, deltaPitch, Space.Self);
// Check pitch bounds
var pitchBounds : Vector3 = barrel.transform.localEulerAngles;
//print("pitchBounds: " + pitchBounds);
if (barrel.transform.localEulerAngles.x > barrelMinRotation && barrel.transform.localEulerAngles.x < 180) {
pitchBounds.x = barrelMinRotation;
} else if (barrel.transform.localEulerAngles.x < barrelMaxRotation && barrel.transform.localEulerAngles.x > 180) {
pitchBounds.x = barrelMaxRotation;
}
barrel.transform.localEulerAngles = pitchBounds;
// Draw Debug Ray
//var forward = barrel.transform.TransformDirection(Vector3.forward) * 10;
//Debug.DrawRay (barrel.transform.position, Vector3.forward * 10, Color.green);
//Debug.DrawRay (barrel.transform.position, barrel.transform.eulerAngles, Color.green);
}
}
function Awake() {
FireMainGun();
}
function FireMainGun() {
if (isTargetInFiringArc()) {
var instantiatedProjectile : Rigidbody = Instantiate (mainGunProjectile, gunMuzzlePoint.transform.position, gunMuzzlePoint.transform.rotation);
instantiatedProjectile.velocity = gunMuzzlePoint.transform.TransformDirection(Vector3 (0, 0, 80.0));
audio.Play();
//instantiatedProjectile.velocity = transform.TransformDirection (Vector3.forward * 10);
//var direction = transform.TransformDirection(Vector3.forward);
//instantiatedProjectile.velocity = direction;
//Physics.IgnoreCollision(instantiatedProjectile.collider, barrel.transform.root.collider);
}
yield WaitForSeconds(3.5);
//FireMainGun();
StartCoroutine("FireMainGun");
//yield
}
function isTargetInFiringArc()
{
if (target)
{
var position : Vector3 = barrel.transform.position;
var direction : Vector3 = target.transform.position - position;
var distance : float = direction.magnitude;
var angle : float = Vector3.Angle(barrel.transform.forward, direction);
var halfFireingArc = 5.0;
//print("angle: " + angle);
if (angle < halfFireingArc && distance < maximumFireRange)
{
return true;
// RaycastHit hit;
// if(Physics.Raycast(position, direction, out hit, distance))
// {
// if(hit.distance > distance - 3.0f)
// return true;
// }
}
}
return false;
}
function FixedUpdate() {
switch (moveMode) {
case MoveModeType.STOP:
engineForce -= brakeForce * Time.deltaTime;
if (engineForce < 0) {
engineForce = 0;
}
// no pitchforce if we stop!
pitchForce = 0.0;
break;
case MoveModeType.FORWARD:
engineForce += accelerationForce * Time.deltaTime;
if (engineForce > maxEngineForce) {
engineForce = maxEngineForce;
}
var pitchAngle = transform.localEulerAngles.x;
if (pitchAngle > 180) {
// vehicle's nose is up, value is below 360В°. Normalize to -x degree.
pitchAngle = -(360 - pitchAngle); // now normalized to (+/-)0-x degree
}
pitchForce = maxEngineForce * pitchAngle / 100.0;
// if (pitchForce > (maxEngineForce / 2.0)) {
// pitchForce = maxEngineForce / 2.0;
// }
//print("pitchAngle: " + pitchAngle + " pitchForce: " + pitchForce);
break;
}
//if (moveToTarget && allowedToMove) {
//rigidbody.AddRelativeForce (0, 0, 10);
//var speed = Vector3 (3, 0, 0);
//rigidbody.MovePosition(rigidbody.position + speed * Time.deltaTime);
transform.Translate(Vector3.forward * Time.deltaTime * (engineForce + pitchForce));
//}
}
function MoveToPoint(newTarget : Vector3) {
moveToTarget = true;
moveMode = MoveModeType.FORWARD;
targetPosition = newTarget;
//print ("Tank moving to: " + targetPosition);
}
// Gets called from the unit manager when this unit gets selected
function SetUnitSelected(selected : boolean) {
isSelected = selected;
healthBar.GetComponent("HealthBar").SetHealthEnabled(isSelected);
}
function SetSelected() {
print("I got selected... " + name);
var go : GameObject = GameObject.Find("UnitManager");
go.SendMessage("AddSelectedUnit", gameObject);
}
////////////////////////////////////////////////////////////////////////*Incore code START*//////////////////////////////////////////////////////////////////////////////
function poiskEnemy() : GameObject {
// Find all game objects with tag Enemy
var gos : GameObject[];
gos = GameObject.FindGameObjectsWithTag("Enemy");
var closest : GameObject;
var distance = Mathf.Infinity;
var position = transform.position;
// Iterate through them and find the closest one
for (var go : GameObject in gos) {
var diff = (go.transform.position - position);
var curDistance = diff.sqrMagnitude;
if (curDistance < distance) {
closest = go;
distance = curDistance;
if(distance < maxDistanceToTarget && distance > minDistanceToTarget)
{
target= closest;
}else {target=null;}
}
}
return closest;
}
function MarkerTarget(ggo:GameObject) {
target=ggo;
}
function incoreMoveTarget(go:boolean) {
incoreMoveToTarget=go;
}
///////////////////////////////////////////////////////////////////////*Incore code END*/////////////////////////////////////////////////////////////////////////////