Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by goosoodude · Sep 24, 2011 at 07:44 PM · animationaidamage

All AI's dying at same time FPS

When I shoot an AI all others die with it. I made sure when I want another, I just make it with scripts and every thing. I don't believe it is in the scripts but I'll post the scripts just in case though

Character damage script:

 var hitPoints = 100.0;
 var deadReplacement : Transform;
 var dieSound : AudioClip;
 function Update()
 {
     if (Input.GetKeyDown(KeyCode.Mouse0))
     {
        ApplyDamage(50.0f);
     }
 }
 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)
     {
         Detonate();
     }
 }
 
 function Detonate () {
     // Destroy ourselves
     Destroy(gameObject);
     
     // Play a dying audio clip
     if (dieSound)
         AudioSource.PlayClipAtPoint(dieSound, transform.position);
 
     // Replace ourselves with the dead body
     if (deadReplacement) {
         var dead : Transform = Instantiate(deadReplacement, transform.position, transform.rotation);
         
         // Copy position & rotation from the old hierarchy into the dead replacement
         CopyTransformsRecurse(transform, dead);
     }
 }
 
 static function CopyTransformsRecurse (src : Transform,  dst : Transform) {
     dst.position = src.position;
     dst.rotation = src.rotation;
     
     for (var child : Transform in dst) {
         // Match the transform with the same name
         var curSrc = src.Find(child.name);
         if (curSrc)
             CopyTransformsRecurse(curSrc, child);
     }
 }


AI Script:

 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;
 
 private var lastShot = -10.0;
 
 // 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;
 
     Patrol();
 }
 
 function Patrol () {
     var curWayPoint = AutoWayPoint.FindClosest(transform.position);
     while (true) {
         var waypointPosition = curWayPoint.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 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;
 }


AI Animation:

var minimumRunSpeed = 1.0;

function Start () { // Set all animations to loop animation.wrapMode = WrapMode.Loop;

 // Except our action animations, Dont loop those
 animation["shoot"].wrapMode = WrapMode.Once;
 
 // Put idle and run in a lower layer. They will only animate if our action animations are not playing
 animation["idle"].layer = -1;
 animation["walk"].layer = -1;
 animation["run"].layer = -1;
 
 animation.Stop();

}

function SetSpeed (speed : float) { if (speed > minimumRunSpeed) animation.CrossFade("run"); else animation.CrossFade("idle"); }

MachineGun script:

 var range = 100.0;
 var fireRate = 0.05;
 var force = 10.0;
 var damage = 5.0;
 var bulletsPerClip = 40;
 var clips = 20;
 var reloadTime = 0.5;
 private var hitParticles : ParticleEmitter;
 var muzzleFlash : Renderer;
 
 private var bulletsLeft : int = 0;
 private var nextFireTime = 0.0;
 private var m_LastFrameShot = -1;
 
 function Start () {
     hitParticles = GetComponentInChildren(ParticleEmitter);
     
     // We don't want to emit particles all the time, only when we hit something.
     if (hitParticles)
         hitParticles.emit = false;
     bulletsLeft = bulletsPerClip;
 }
 
 function LateUpdate() {
     if (muzzleFlash) {
         // We shot this frame, enable the muzzle flash
         if (m_LastFrameShot == Time.frameCount) {
             muzzleFlash.transform.localRotation = Quaternion.AngleAxis(Random.value * 360, Vector3.forward);
             muzzleFlash.enabled = true;
 
             if (audio) {
                 if (!audio.isPlaying)
                     audio.Play();
                 audio.loop = true;
             }
         } else {
         // We didn't, disable the muzzle flash
             muzzleFlash.enabled = false;
             enabled = false;
             
             // Play sound
             if (audio)
             {
                 audio.loop = false;
             }
         }
     }
 }
 
 function Fire () {
     if (bulletsLeft == 0)
         return;
     
     // If there is more than one bullet between the last and this frame
     // Reset the nextFireTime
     if (Time.time - fireRate > nextFireTime)
         nextFireTime = Time.time - Time.deltaTime;
     
     // Keep firing until we used up the fire time
     while( nextFireTime < Time.time && bulletsLeft != 0) {
         FireOneShot();
         nextFireTime += fireRate;
     }
 }
 
 function FireOneShot () {
     var direction = transform.TransformDirection(Vector3.forward);
     var hit : RaycastHit;
     
     // Did we hit anything?
     if (Physics.Raycast (transform.position, direction, hit, range)) {
         // Apply a force to the rigidbody we hit
         if (hit.rigidbody)
             hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
         
         // Place the particle system for spawing out of place where we hit the surface!
         // And spawn a couple of particles
         if (hitParticles) {
             hitParticles.transform.position = hit.point;
             hitParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
             hitParticles.Emit();
         }
 
         // Send a damage message to the hit object            
         hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
     }
     
     bulletsLeft--;
 
     // Register that we shot this frame,
     // so that the LateUpdate function enabled the muzzleflash renderer for one frame
     m_LastFrameShot = Time.frameCount;
     enabled = true;
     
     // Reload gun in reload Time        
     if (bulletsLeft == 0)
         Reload();            
 }
 
 function Reload () {
 
     // Wait for reload time first - then add more bullets!
     yield WaitForSeconds(reloadTime);
 
     // We have a clip left reload
     if (clips > 0) {
         clips--;
         bulletsLeft = bulletsPerClip;
     }
 }
 
 function GetBulletsLeft () {
     return bulletsLeft;
 }
Comment
Add comment · Show 2
10 |3000 characters needed characters left characters exceeded
â–¼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image goosoodude · Sep 24, 2011 at 10:06 PM 0
Share

$$anonymous$$ay I please have some help. I'm sorry if you think im being rude.

avatar image timberland8989 · Sep 25, 2011 at 03:38 AM 0
Share

Thanks for co$$anonymous$$g our timberland online store! Just enjoy yourself here! As a developping company, timberland boots always can give us some surprise .I belive timberland shoes Sale can make your feet more comfortable, make your life more stylish!If you want to have a try ,just click here: discount timberland boots Free delivery

timberland

timberland boot

timberland shops

timberland 2011

discount timberland

wholesale timberland

timberland chaussures

1 Reply

· Add your reply
  • Sort: 
avatar image
1

Answer by syclamoth · Sep 24, 2011 at 10:52 PM

Well, the most obvious problem here is that you are calling ApplyDamage with direct Input! This means that whenever the Mouse0 button is held down, every enemy in the scene will be taking damage. You need to set up proper weapon damage models, and use ApplyDamage on a per-hit basis, instead of simply making Mouse0 directly damage the enemies.

Comment
Add comment · Show 5 · Share
10 |3000 characters needed characters left characters exceeded
â–¼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image aldonaletto · Sep 24, 2011 at 11:12 PM 0
Share

This $$anonymous$$ouseButton thing was a testing feature I suggested some time ago to @goosoodude because his enemy was not receiving damage - and he forgot to remove...
@goosoodude, remove the Update function, since it's only serving to this purpose. The damage must be applied by the weapon script: if using $$anonymous$$achineGun, the script uses a Raycast; if an enemy is hit, the script sends a message to it using something like hit.collider.Broadcast$$anonymous$$essage("ApplyDamage",...)

avatar image syclamoth · Sep 25, 2011 at 02:11 PM 0
Share

whoops- yeah that'd explain it.

avatar image goosoodude · Sep 25, 2011 at 02:28 PM 0
Share

Um... Not to be dumb, but how do I do that?

avatar image goosoodude · Sep 25, 2011 at 02:29 PM 0
Share

Like where does the script go, like above what, because I'll put my machine gun script in!

avatar image syclamoth · Sep 26, 2011 at 08:23 AM 0
Share

Well, this is pretty basic stuff. There are a few ways of doing it- if you are instantiating bullet prefabs (good for reasonably slow projectiles unless you are using a custom physics engine), then put a script on the bullet prefab which sends messages when it strikes an enemy using OnCollision. If you are using direct-damage weapons, then you should use Physics.Raycast, and have the damage dealt directly by the weapon.

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

4 People are following this question.

avatar image avatar image avatar image avatar image

Related Questions

A* Pathfinding project with mecanim animation 0 Answers

Enemy Ragdoll help 1 Answer

Damage trigger? 1 Answer

Why won't my animation play? 1 Answer

basic health and damage system 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges