hello everybody…
Today, something strange happedned:
I wrote a headshot-code for the AI.js-script and when I started the game, everything went normally, but when I killed the charcter, unity crashed… :shock:
That’s the code for the headshots:
var hitSound : AudioClip;
var DMGheight1 = 12.0;
var apply : boolean = true;
var Character : AI;
private var collisionMagnitude : float;
var HeadShots : float;
killed = false;
function OnCollisionEnter (hit : Collision) {
if (apply == true) {
if (hit.relativeVelocity.magnitude >= DMGheight1) {
Character.gameObject.animation.CrossFade("hit");
collisionMagnitude = hit.relativeVelocity.magnitude;
}
if (hit) {
HeadShots++;
audio.PlayOneShot(hitSound, 0.5);
}
}
}
function ApplyDamage (damage : float) {
// We already have less than 0 hitpoints, maybe we got killed already?
if (Character != null) {
Character.SendMessage("ApplyDamage", collisionMagnitude * 2);
}
if (Character == null) {
Destroy(GetComponent(AiHeadShot1));
}
}
function Destroy (killed : boolean) {
if (killed == true) {
Destroy(GetComponent(AiHeadShot1));
}
else {
}
}
And this is my (modified) AI-code:
var speed = 3.0;
var rotationSpeed = 5.0;
var shootRange = 15.0;
var attackRange = 30.0;
var shootAngle = 4.0;
var dontComeCloserRange = 5.0;
var delayShootTime = 0.35;
var pickNextWaypointDistance = 2.0;
var target : Transform;
var hitSound : AudioClip;
var hitPoints = 100;
var dieSound : AudioClip;
var playSound : boolean = true;
var playAnim : boolean = true;
var jumpSpeed = 8.0;
var JumpSound1 : AudioClip;
var JumpChecker : AiJumpWallChecker1;
private var jump : boolean = false;
var headShotDanger : boolean = false;
private var lastShot = -10.0;
var DMGheight1 = 12.0;
var apply : boolean = true;
var Head : AiHeadShot1;
private var moveDirection = Vector3.zero;
SetRagdollEnabled(false);
function OnCollisionEnter (hit : Collision) {
if (apply == true) {
if (hit.relativeVelocity.magnitude >= DMGheight1) {
animation.CrossFade("hit");
hitPoints -= hit.relativeVelocity.magnitude/2;
if (hitPoints <= 0.0) {
SetRagdollEnabled(true);
}
}
}
}
function ApplyDamage (damage : float) {
// We already have less than 0 hitpoints, maybe we got killed already?
if (hitPoints <= 0.0)
return;
hitPoints -= damage;
if (hitPoints <= 0.0) {
SetRagdollEnabled(true);
}
}
function SetRagdollEnabled (enableRagdoll : boolean) {
animation.Stop();
var bodies : Component[] = GetComponentsInChildren(Rigidbody);
for (var body : Rigidbody in bodies)
{
if (enableRagdoll) {
body.detectCollisions = true;
body.isKinematic = false;
if (playSound == true) {
audio.PlayOneShot(dieSound);
playSound = false;
Destroy(GetComponent(AI));
Destroy(GetComponent(CharacterController));
}
hitPoints = 0.0;
Head.SendMessage("Destroy", true);
}
else {
Head.rigidbody.detectCollisions = true;
Head.rigidbody.isKinematic = true;
body.detectCollisions = false;
body.isKinematic = true;
}
}
}
// Make sure there is always a character controller
@script RequireComponent (CharacterController)
function Start () {
// Auto setup player as target through tags
if (target == null GameObject.FindWithTag("Player"))
target = GameObject.FindWithTag("Player").transform;
if (target == null) {
GameObject.FindWithTag("Player");
}
Patrol();
}
function Patrol ()
{
var curWayPoint = AutoWayPoint.FindClosest(gameObject.transform.position);
while (true)
{
var waypointPosition = curWayPoint.gameObject.transform.position;
// Are we close to a waypoint? -> pick the next one!
if (Vector3.Distance(waypointPosition, transform.position) < pickNextWaypointDistance)
curWayPoint = PickNextWaypoint (curWayPoint);
// Attack the player and wait until
// - player is killed
// - player is out of sight
if (CanSeeTarget ())
yield StartCoroutine("AttackPlayer");
// Move towards our target
MoveTowards(waypointPosition);
yield;
}
}
function Jump () {
audio.PlayOneShot(JumpSound1, 0.5);
animation.CrossFade("jump");
yield new WaitForSeconds (0.4);
jump = true;
yield new WaitForSeconds (0.2);
jump = false;
JumpChecker.SendMessage("ResetJumper", true);
}
function MissileDanger () {
animation.CrossFade("jump");
yield new WaitForSeconds (0.3);
headShotDanger = true;
yield new WaitForSeconds (0.2);
headShotDanger = false;
yield;
}
function Update () {
if (jump == true) {
transform.Translate(0, jumpSpeed * 1.2 * Time.deltaTime, jumpSpeed * Time.deltaTime, Space.World);
}
if (headShotDanger == true) {
transform.Translate(jumpSpeed * Time.deltaTime, jumpSpeed * Time.deltaTime, 0, Space.World);
}
}
function CanSeeTarget () : boolean
{
if (Vector3.Distance(transform.position, target.position) > attackRange)
return false;
var hit : RaycastHit;
if (Physics.Linecast (transform.position, target.position, hit))
return hit.transform == target;
return false;
}
function Shoot ()
{
// Start shoot animation
animation.CrossFade("shoot", 0.3);
// Wait until half the animation has played
yield WaitForSeconds(delayShootTime);
// Fire gun
BroadcastMessage("Fire");
// Wait for the rest of the animation to finish
yield WaitForSeconds(animation["shoot"].length - delayShootTime);
}
function AttackPlayer ()
{
var lastVisiblePlayerPosition = target.position;
while (true)
{
if (CanSeeTarget ())
{
// Target is dead - stop hunting
if (target == null)
return;
// Target is too far away - give up
var distance = Vector3.Distance(transform.position, target.position);
if (distance > shootRange * 3)
return;
lastVisiblePlayerPosition = target.position;
if (distance > dontComeCloserRange)
MoveTowards (lastVisiblePlayerPosition);
else
RotateTowards(lastVisiblePlayerPosition);
var forward = transform.TransformDirection(Vector3.forward);
var targetDirection = lastVisiblePlayerPosition - transform.position;
targetDirection.y = 0;
var angle = Vector3.Angle(targetDirection, forward);
// Start shooting if close and play is in sight
if (distance < shootRange angle < shootAngle)
yield StartCoroutine("Shoot");
}
else
{
yield StartCoroutine("SearchPlayer", lastVisiblePlayerPosition);
// Player not visible anymore - stop attacking
if (!CanSeeTarget ())
return;
}
yield;
}
}
function SearchPlayer (position : Vector3)
{
// Run towards the player but after 3 seconds timeout and go back to Patroling
var timeout = 3.0;
while (timeout > 0.0)
{
MoveTowards(position);
// We found the player
if (CanSeeTarget ())
return;
timeout -= Time.deltaTime;
yield;
}
}
function RotateTowards (position : Vector3)
{
SendMessage("SetSpeed", 0.0);
var direction = position - transform.position;
direction.y = 0;
if (direction.magnitude < 0.1)
return;
// Rotate towards the target
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
}
function MoveTowards (position : Vector3)
{
var direction = position - transform.position;
direction.y = 0;
if (direction.magnitude < 0.5)
{
SendMessage("SetSpeed", 0.0);
return;
}
// Rotate towards the target
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
// Modify speed so we slow down when we are not facing the target
var forward = transform.TransformDirection(Vector3.forward);
var speedModifier = Vector3.Dot(forward, direction.normalized);
speedModifier = Mathf.Clamp01(speedModifier);
// Move the character
direction = forward * speed * speedModifier;
GetComponent (CharacterController).SimpleMove(direction);
SendMessage("SetSpeed", speed * speedModifier, SendMessageOptions.DontRequireReceiver);
}
function PickNextWaypoint (currentWaypoint : AutoWayPoint)
{
// We want to find the waypoint where the character has to turn the least
// The direction in which we are walking
var forward = transform.TransformDirection(Vector3.forward);
// The closer two vectors, the larger the dot product will be.
var best = currentWaypoint;
var bestDot = -10.0;
for (var cur : AutoWayPoint in currentWaypoint.connected)
{
var direction = Vector3.Normalize(cur.transform.position - transform.position);
var dot = Vector3.Dot(direction, forward);
if (dot > bestDot cur != currentWaypoint)
{
bestDot = dot;
best = cur;
}
}
return best;
}
So I ask:
What’s the problem?