Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 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 Michael 12 · Mar 20, 2011 at 06:19 PM · playerfpsattackzombiemelee

Zombie Alien Mellee Attack

OK I think I'm finally starting to make some head way with this. I've basically pulled out what I believe are all of the stuff related to weapons fire in the Robot AI script from the FPS tutorial in an attempt to get it to work for my Alien Zombies, which do not have weapons. So what I've got now is 4 animations for my Alien Zombie as follow:

1 - Take01 just his T-pose and not used 2 - idle 3 - Walk 4 - RunAttack (Which is supposed to occure when my FPS player is within attack range) 5 - Attack (which is baically a biting and clawing attack which should happen when he reaches or collides with my FPS player)

Now what I can't figure out is how to implement these animation into my script. Right now it's kinda cute, he follows me around when within range otherwise he wanders off back to his way points and idles lol

Here is my script so far, I would sure apreciate any help some of you more experience at code than I could help me out with or point me in the right direction. Much thanks:

var speed = 3.0; var rotationSpeed = 5.0; var attackRange = 30.0; var dontComeCloserRange = 5.0; 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 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 &gt; attackRange * 3)
             return;

         lastVisiblePlayerPosition = target.position;
         if (distance &gt; 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);


     } 

     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 &lt; 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 &gt; bestDot &amp;&amp; cur != currentWaypoint) {
         bestDot = dot;
         best = cur;
     }
 }

 return best;

}

Comment
Add comment
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

1 Reply

· Add your reply
  • Sort: 
avatar image
1

Answer by Owen-Reynolds · Mar 21, 2011 at 06:29 AM

You're pretty much done. You'll have to select Split for your imported model (in Project, not the GameObject) and manually set each animation frames/name.

[edit] After slicing the animation into named clips, go to the actual zombie gameObject, and make sure its animation list has them all (should see a list of just the clip names.)

[edit] A cheap test is to set each one in turn as the animation (with PlayAutomatically checked) and run the game.

The Animation scripting reference (and the introduction linked from there) pretty much spells the rest out.

Two comments: you can safely run "Play" on an animation every frame. If it was already started, it won't rewind (in other words, you don't have to think of a way to play attack only if you just started attacking.)

I'd leave looping walk/idle on layer 0, and put runAttack and attack as PlayOnce on layer 1 (so you don''t need to start walk when attack ends -- it will automatically go back to walk.)

The docs are thorough, explaining layers, code samples... .

[edit] For code, try (in attack):

if (distance > dontComeCloserRange)
   MoveTowards (lastVisiblePlayerPosition);
else {
   animate.CrossFade("attack"); // -- the new line
   RotateTowards(lastVisiblePlayerPosition);
}
Comment
Add comment · Show 7 · 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 Michael 12 · Mar 21, 2011 at 02:31 PM 0
Share

Thanks owenpat. I should mention to that I was not sure if my calls to animation should be inside of this script or if they should be in my other script because I did try putting one if statement in here that called an animation to occure and it said something about not finding any animations even though they ARE added corectly. Also because of the way $$anonymous$$AX 8 FBX exported my models, they were rotated incorrectly so the had to be placed inside of an empty game object so my animation call are modelAnimations.CrossFade etcetera. so I'm guesing I might need a workaround? Right now they follow me

avatar image Michael 12 · Mar 21, 2011 at 02:36 PM 0
Share

I also should mention that "Attack" is like a clawing and biting kind of animation so I was thinking that one should continue to play some how if the Alien Zombie is right in contact with my player and stop if my player gets out of range, and then he would need run after him again in order to get close enough to do his attack animation. I'm also struggling to figure out how to make that "Attack" actually do dameage and remove hit points from my FPS player??

avatar image Owen-Reynolds · Mar 21, 2011 at 10:17 PM 0
Share

Edited my reply for 1st comment. On the export from $$anonymous$$ax, look for a "flipYZ" button. Or, just grab all the verts and do a 90deg spin so that Y is up and Z is forwards. A common modelling trick (so they tell me.) Once you have animation running, you'll have a better feel for what looks good. For damage, use a timer and hurt the player if you are close enough. Bullet hits and claw hits are otherwise about the same.

avatar image Michael 12 · Mar 21, 2011 at 10:51 PM 0
Share

$$anonymous$$y Version of $$anonymous$$AX 8 does not have that in the FBS export option, that was why we had to place our alien Zombies inside of an empty game object which was rotated the correct way and access the animation inside of that game object via "modelAnimations.CrossFade...." So I'll test out what you wrote in your edit but I don't think it will work based on how my Zombie aliens are set up.

avatar image Michael 12 · Mar 21, 2011 at 11:00 PM 0
Share

Nope it didn't, Important to keep in $$anonymous$$d that my Alien Zombies are inside of an empty game object so references to the animation has to look inside of that game object... heck it confuses me too but because of the Stooopid way that $$anonymous$$ax 8 Export models using that version of FBX exporter that was how they needed to be placed otherwise I ended up with "Swim$$anonymous$$g Zombies." And No there is no updated version of FBX exporter they only supported back to $$anonymous$$AX 9, software companies really know how to stick it in and break it off don't they? :(

Show more comments

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

No one has followed this question yet.

Related Questions

Why Zombie clones dont take Player's HP? 0 Answers

Ai Zombie Melee Attack script. 5 Answers

Need help making player invincible momentarily 2 Answers

player collision detectionn registering problem with an object 1 Answer

How to make my player not lose health when attacking the enemy? 2 Answers


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