Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice

FINAL IK - Full Body IK, Aim, Look At, FABRIK, CCD IK... [1.0 RELEASED]

Discussion in 'Assets and Asset Store' started by Partel-Lang, Jan 15, 2014.

  1. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    No no, that's the blend parameter of the blend tree that just blends between the animations. Click on that "Blend Tree", then on the right side in the Inspector you can the speed of each motion in that blend tree. Looks like a little clock icon.

    Pärtel
     
  2. puzzlekings

    puzzlekings

    Joined:
    Sep 6, 2012
    Posts:
    402
    Ok, cool - many thanks :)
     
  3. Purpleshine84

    Purpleshine84

    Joined:
    Apr 8, 2013
    Posts:
    194
  4. Purpleshine84

    Purpleshine84

    Joined:
    Apr 8, 2013
    Posts:
    194
  5. Purpleshine84

    Purpleshine84

    Joined:
    Apr 8, 2013
    Posts:
    194
    Ok, I like to have the full IK but I don't like to have the character's feet slipping from the navmesh. Is there a way to prevent this with an option in Final IK?
     
  6. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey,
    Sorry, no, it's not something the solver can do. If there's nothing to step on, the foot will have to go down. Otherwise if the foot moved slowly towards the edge and over it, the raycasting would make it smoothly slide off the platform and then just snap back up when no raycast hit found.
    The only way to solve it would be to make the collider bigger somehow.

    Pärtel
     
  7. puzzlekings

    puzzlekings

    Joined:
    Sep 6, 2012
    Posts:
    402
    Hi Partel

    I thought it would be cool to do a quick integration of the FinalIK Grounder Bot + Apex Path with Height Navigation, and it seems to work and it looks quite good, particularly the way the Bot deals with angled surfaces and kind of hangs when walking on the edge of a platform.

    Here's a 1 minute video if you're interested: https://dl.dropboxusercontent.com/u/10212162/FinalIK_ApexPath.mov

    cheers

    Nalin
     
    Partel-Lang likes this.
  8. puzzlekings

    puzzlekings

    Joined:
    Sep 6, 2012
    Posts:
    402
    Hi Partel

    New year greetings :)

    I am trying to add left and right sound footsteps to the MechBot and wondering what is the best way to do this?

    I notice that the grounder has an OnPostGrounder delegate which the GrounderIK uses to solve the IK for each leg, but I need to trigger the sounds is when each foot/ankle comes into initial contact with the Terrain. I was thinking maybe to add a sound field for a LimbIK and trigger that at an appropriate time?

    Please can you advise on the best way to do this?

    cheers

    Nalin
     
    WendelinReich likes this.
  9. BigLouis1971

    BigLouis1971

    Joined:
    Mar 26, 2014
    Posts:
    107
    I think you work is great, but I'm a newbie with a really small budget because I have no income from game development yet. Because of that your assets are a little expensive for my budget right now so I was wondering if a discount is possible towards the purchase of PuppetMaster if I buy Final IK first, or vice-versa.

    If it's not possible is ok, I have cero experience in game development and for me to be able to come up with something like this will take ages of learning and frustration. If it's not possible, I'm getting nice value for the money at the price it is right now anyway. I guess it won't hurt anybody to ask first right?

    I hope this post is no offense for the developers or any other member. Thanks for reading!
     
    Last edited: Jan 1, 2016
  10. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey, Happy New Year to everyone!

    Hey, that looks great, thanks for sharing the vid! :)

    The Grounder doesn't actually even know when the foot is in contact with the ground. But since you are using animation, you can add events in the animation importer, where a foot hits the ground, and use them to play the sound. You can use grounder.solver.legs[index].isGrounded to know if there is ground beneath the foot within the "Max Step" distance.

    Hey,
    I don't have any tools in the Asset Store Publisher backend to offer individual discounts, sorry.

    Pärtel
     
  11. SVTiare-Tom

    SVTiare-Tom

    Joined:
    Sep 27, 2013
    Posts:
    9
    Happy New Year everyone!

    Ran into an issue when spawning particle effects with Aim IK applied.
    Particles will spawn as if Aim IK isn't being applied.
    Its kinda hard to explain so Ive attached some pictures

    aimIK-on.PNG

    aimIK-off.PNG

    Any insight into this matter would be greatly appreciated :)
     
  12. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey,

    it is unfortunately impossible to change when the ParticleSystem updates in Unity.
    It does so after Mecanim has applied the animation but before LateUpdate in which IK runs so it will spawn from the animated position no matter how we change it in LateUpdate.

    One solution would be to make a new empty gameobject to where the ParticleEmitter is, then unparent the ParticleSystem and make a script that just set's it's position and rotation to match the empty gameobject in LateUpdate. That script needs to run after Final IK so add it to a higher value than Final IK scripts in the Script Execution Order. The problem with that is that your particle position will lag 1 frame behind, but in most cases it is not important.

    Another solution would be to disable Animator and IK and update them in Update();
    Just disable the components and update them like so:

    Code (CSharp):
    1. animator.Update(Time.deltaTime);
    2. ik.solver.Update();
    Disabling the Animator and updating it in Update might interfere with some other things or not work well with your animation code though.

    Pärtel
     
    SVTiare-Tom and hopeful like this.
  13. MalcolmWashington

    MalcolmWashington

    Joined:
    Jul 16, 2015
    Posts:
    12
    hi.

    I downloaded "EffectorAnimatorPreview.asset" but I get errors.
     

    Attached Files:

  14. SVTiare-Tom

    SVTiare-Tom

    Joined:
    Sep 27, 2013
    Posts:
    9
    Thanks Pärtel!

    Appreciate all help :D
     
  15. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey,

    That preview package is very old, a WIP that I have not worked on for almost 2 years. The last Final IK version it worked with was 0.3 or something. But if you think you could use, I got rid of the errors and re-uploaded the package.

    Pärtel
     
  16. supererogatory

    supererogatory

    Joined:
    Feb 13, 2015
    Posts:
    2
    I am interested in having a head effector, as some others have mentioned. I'm using IK for arm movements from hand position, but we also have head position and rotation from a VR headset. Until .5 comes out, is there a way to do this with the look-at IK? Do you have an estimate for when you think .5 may be done?
     
  17. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey, you have stumbled upon some very old information, we are already at version 1.2 :)
    The head effector is there, check out the "Head Effector" demo scene and also the 3 VR demos.

    Cheers,
    Pärtel
     
  18. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey,

    It's because in your script, you disable the FBBIK component and call ik.solver.Update() only on the condition of

    Code (CSharp):
    1. Input.GetKey(KeyCode.F) && dist  < 2.0f
    AnimationWarping extends from OffsetModifier (like Inertia, Amplifier, HitReaction, Recoil and others) so it applies it's offsets on the IK only when it is updated. So thats why the warping only takes effect when you hold down F and dist < 2.0f.

    Cheers,
    Pärtel
     
  19. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    :)
    Looks like the hand IK effector is stuck in where it last was and the effector weight still > 0.
    Writing ik.enabled = false here does not help, the component is disabled already in start and it's solver updated by ik.solver.Update();
    So you either need to stop calling it or blend the hand effector weight back to 0.

    Pärtel
     
    Der_Kevin likes this.
  20. S37H

    S37H

    Joined:
    Apr 1, 2012
    Posts:
    24
    I'm using offset pose for carrying a one handed item exactly as you've demonstrated in your Interaction System
    Part 2 tutorial video. It works great but the rotation of the hand and object aren't what I want. What would you recommend for offsetting rotation? Thanks!

    Edit : I ended up doing this -

    ik.solver.rightHandEffector.rotation = Quaternion.Euler(handRotation);
    ik.solver.rightHandEffector.rotationWeight = .8f;

    Now I just need to figure out how to make it use the elbow bend goal in this situation :)
     
    Last edited: Jan 7, 2016
  21. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey,

    I'm not sure I understand,
    can you make a screenshot of the wrong rotation please?

    You can use an elbow bend goal if you assign an object as the "Bend Goal" for the limb in the FBBIK inspector and set "Bend Goal Weight" to 1.

    Cheers,
    Pärtel
     
  22. frankmat

    frankmat

    Joined:
    Sep 14, 2013
    Posts:
    42
    Hi,

    I'm having issues getting Final IK working with UMA2... and was hoping it might be something simple that I have missed.

    I've created the character dynamically in UMA.... I then use the example from picking up the sphere 2 handed scene... which is pretty simple. Adding the interaction object etc... when I click on "Pickup Sphere" my character reaches over and picks up the Sphere ok... but then my UMA character starts sliding around the plane on his own whilst holding the ball.

    It is always a random direction as well... I obviously don't want him picking up the ball and then that causing him to move around the scene... I just want him to stand there holding the ball as per the example.

    I've torn my hair out trying to figure out what is causing it (The ball isKinematic...) Does anyone have any idea what could cause this?

    Cheers
    Frank
     
  23. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey, maybe the ball is colliding with the character collider? Set them to different layers and disable collision between them in the Edit/Project Settings/Physics/Layer Collision Matric to make sure if this is indeed the case.

    Cheers,
    Pärtel
     
  24. supererogatory

    supererogatory

    Joined:
    Feb 13, 2015
    Posts:
    2
    Thank you.

    I am now using the FBBIK Head Effector script, and Full Body Biped IK for hand IK, with a head mounted display and hand held controllers. I find that slightly turning the head left or right causes the whole body to shift at the hips. I would like to keep the movement as limited to the head and neck as possible. The avatar and user should be seated. I have adjusted the variables in the inspector with this in mind, but the body still moves a lot with the head. Are there any tutorials on the head effector, or demos with seated avatars, that could help me?

    Thanks again.
     
  25. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey,

    Just weigh in the body effector to fix the hips and lower spine. If that's not enough, try also increasing the weight of shoulder effectors, but that will start decreasing accuracy.
    Also, try decreasing the weight of the "Bend Bones". Expand the array and there's a slider for each bone.

    Pärtel
     
  26. immeasurability

    immeasurability

    Joined:
    Apr 22, 2014
    Posts:
    125
    hi!
    how to limit the turning of arms and legs in fullbodybipedik? rotation limit works only when the hands and feet dont have position weight Oo on target
     
    Last edited: Jan 15, 2016
  27. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey,
    The rotation limits work with CCD, FABRIK and AimIK solvers, FBBIK is a different kind of solver. Applying rotation limits on an animated character is usually not a good idea, you'll get snaps from one end of the limit to another and stuff like that. With FBBIK you should limit the position of the end effector instead, make sure it doesn't go where it is not supposed to go, like inside the body. Also, you can use the bend goals to enforce an elbow bending direction.

    Pärtel
     
  28. wightwhale

    wightwhale

    Joined:
    Jul 28, 2011
    Posts:
    397
    I'm trying to use the aimIK to have my character swing the sword aimed lower or higher based on the enemy height. But I'm having a bit of trouble when the spine is rotating for the animation. The aimIK forces the spine to keep facing the target's direction where I'm looking to get a more vertical lock and allow the spine to rotate with the animation. I'm not sure if this is even possible to make this look correct.
     
  29. wightwhale

    wightwhale

    Joined:
    Jul 28, 2011
    Posts:
    397
    I found the boxing demo and I have my first swing working pretty well. I'm wondering if the pin needs to be set separately for each animation. Also should the pin be the position of the last joint finishing position at the end of the animation? I think my main issue is still that the animation makes the character face the opposite direction during the attack animation.
     
  30. wightwhale

    wightwhale

    Joined:
    Jul 28, 2011
    Posts:
    397
    I've also found your swing example now and I have it mostly working with my character but it still looks strange. I think the biggest thing that's confusing me is the pin, I don't understand how it works and why.
     
  31. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey,

    The Pin is just a marker that indicates where the stick hits the "target" in the animation clip. You can just play the animation normally and pause it when the stick is supposed to hit something and place the pin there.
    So the "Swing Target's" offset from the pin will be a job for AimIK to solve.

    You can also tweak the individual bone weights in AimIK to improve the looks, adjust how much each bone in the spine will bend.

    Cheers,
    Pärtel
     
  32. WendelinReich

    WendelinReich

    Joined:
    Dec 22, 2011
    Posts:
    228
    Hi Pärtel,

    just updated to 1.2 and I'm getting this error: "Trying to update IK solver before initiating it. If you intended to disable the IK component to manage it's updating, use ik.Disable() instead of ik.enabled = false, the latter does not guarantee solver initiation."

    And indeed, my FBBIK solver isn't updated anymore. This seems to have something to do with Disable() now being deprecated. I changed solverXY.Disable() to ....enabled = false everywhere (this happens early, during Awake() or Start()), but that seems to mean that the solver is never initialized.

    So my question is, how do I initialize it manually (the solver is a component on my character)?
     
  33. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey, glad to see you're still around :)
    There was a bug that didn't initiate IK components when they were disabled in Awake, but it has been already fixed in 1.3 which is submitted and pending review.

    Cheers,
    Pärtel
     
    WendelinReich likes this.
  34. WendelinReich

    WendelinReich

    Joined:
    Dec 22, 2011
    Posts:
    228
    Hell yeah. And this will be the year where everyone falls in love with my final IK-supported virtual dog :)

    In the meantime, could you just tell me the correct way of manually initializing the component? Call Initialize with reference to transform?
     
  35. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Code (CSharp):
    1. ik.solver.Initiate(ik.transform);
    Can't wait to see the dog :p
     
    WendelinReich likes this.
  36. magique

    magique

    Joined:
    May 2, 2014
    Posts:
    4,021
    Is it possible to use FinalIK Grounder on a quadruped and have it walk around a spherical object? I have code to simulate the gravity around the spherical object so it is always stuck on the object's surface no matter where it is on the surface, but I'm not sure how to align the model to the surface so it is oriented properly. Then I thought of FinalIK Grounder, which keeps the feet placement precise. However, would this still work even if the character were upside down on a sphere? I'll experiment with it myself when I get to my development computer, but I was just curious if anyone knew if this was possible before I even make the attempt.
     
  37. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey, it currently works around a sphere as long as you keep "Root Rotation Weight" at 0, because that rotates the root of the quadruped around it's X axis and that does not work upside down.
    But if you change the code in GrounderQuadruped.cs private void RootRotation() {} to:

    Code (CSharp):
    1. private void RootRotation() {
    2.             if (rootRotationWeight <= 0f) return;
    3.             if (rootRotationSpeed <= 0f) return;
    4.  
    5.             solver.rotateSolver = true;
    6.             forelegSolver.rotateSolver = true;
    7.            
    8.             // Get the horizontal rotation of the character
    9.             Vector3 tangent = characterRoot.forward;
    10.             tangent += Vector3.Project(tangent, gravity);
    11.  
    12.             Quaternion horizontalRotation = Quaternion.LookRotation(tangent, -gravity);
    13.  
    14.             // Get the direction from root hit to forelegs root hit in the space of the horizontal character rotation
    15.             Vector3 hitDirection = forelegSolver.rootHit.point - solver.rootHit.point;
    16.             Vector3 hitDirectionLocal = Quaternion.Inverse(horizontalRotation) * hitDirection;
    17.            
    18.             // Get the angle between the horizontal and hit directions
    19.             float angleTarget = Mathf.Atan2(hitDirectionLocal.y, hitDirectionLocal.z) * Mathf.Rad2Deg;
    20.             angleTarget = Mathf.Clamp(angleTarget * rootRotationWeight, minRootRotation, maxRootRotation);
    21.            
    22.             // Interpolate the angle
    23.             angle = Mathf.Lerp(angle, angleTarget, Time.deltaTime * rootRotationSpeed);
    24.            
    25.             // Rotate the character
    26.             characterRoot.rotation = Quaternion.Slerp(characterRoot.rotation, Quaternion.AngleAxis(-angle, characterRoot.right) * horizontalRotation, weight);
    27.         }
    ... and add

    Code (CSharp):
    1. public Vector3 gravity = Vector3.down;
    Then you can use the root rotation if you update the gravity vector.

    Cheers,
    Pärtel
     
  38. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Btw, Final-IK 1.3 is available on the Store.
    Bunch of fixes and improvements, see the release notes.
    If you also have PuppetMaster, make sure to update to PuppetMaster 0.3 simultaneously. :)

    Cheers,
    Pärtel
     
    WendelinReich likes this.
  39. magique

    magique

    Joined:
    May 2, 2014
    Posts:
    4,021
    Thanks, Partel. I'll definitely give this all a try.
     
  40. WendelinReich

    WendelinReich

    Joined:
    Dec 22, 2011
    Posts:
    228
    Hey Pärtel another question. In the store-description of Final IK, you mention that "Full Body IK" part under "Future plans". It's been sitting there for a year I think, and I remember you mentioning it in 2014 already. Are you still working on that? It would make my life so much easier - getting a humanoid FBBIK to work on a dog (which has longer bone chains on its limbs) is a pain... :)
     
  41. giraffe1

    giraffe1

    Joined:
    Nov 1, 2014
    Posts:
    290
    I have run into the same issue as SVTiare Tom



    Red lines are from the eye transform in Update()

    Green lines are from the eye transform in a coroutine

    Blue lines are from the tip of the barrel (I have it selected - the active gizmo thingy) fired by OnStateEnter in a state machine behavior for shot animation in the animator .

    And all FinalIK stuff in LateUpdate().

    I notice when I turn off the FinalIK Component everything lines up perferctly (both the eye and barrel transforms)

    I am trying to get the blue line's start position to match the tip of the barrel closer. And if possible the green lines one too.

    Could you please share any example script(s) of how you would achieve this using the technique you mentioned below.

    Thanks a lot.

     
    Last edited: Jan 24, 2016
  42. Martin_H

    Martin_H

    Joined:
    Jul 11, 2015
    Posts:
    4,433
    Hi Pärtel, thanks for the update! I'm having a few issues with it though. I deleted the "plugin" folder in my project, downloaded and imported the new version and got a few errors that prevented me from running play mode. I made a new project, redownloaded FinalIK and imported it into the empty project. Seemed to work. I opened my real project again, deleted the "plugin" folder again, exited unity, copied the plugin folder from the fresh project over in the windows explorer, launched unity again and opened my project. This time no errors prevented me from compiling. I don't understand why.
    I opened the mech spider demo scene and hit play. It works, but I get a lot of errors in the log window like "Invalid AABB result", "Invalid AABB a", "IsFinite(outDistanceForSort)" and so on. I checked the demo in my clean project that has nothing but the fresh FinalIK 1.3 in it and I get the same errors. So I'm hoping this is not something that I did wrong?!
    Can any other users confirm? Im using win7 64 bit, Unity 5.3.1f1 personal edition.
    I have yet to really use FinalIK, because I'm not yet in the phase of my project where I'll need it. So I can't know for sure that older versions worked perfectly on my system. There might be incompatibilities that have been present before and/or unity bugs. Let me know if I can help you track this down.
     
  43. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    Hey guys, sorry for the delay, I'm in half way across the globe, in California so support might be slow this week.

    Yes, I've been dreaming of a generic FBIK version for a long time, have not had the time to create one yet though.
    I've thought, there's no real point of creating one if it's just gonna be the same as FBBIK, but just a pain to set up.
    I've been experimenting with some new techniques instead, maybe I'll find a better solution. In the meanwhile, FBBIK can be used on dogs, you can just skip one of the 4 bones in the limbs.

    Hey,

    If you fire the blue line in OnStateEnter, then AimIK has not applied yet. You'll need to raise a flag in OnStateEnter and execute the code after AimIK is done.
    You can do that by registering a delegate to get a call from AimIK in Start:

    Code (CSharp):
    1. void Start() {
    2. aimIK.solver.OnPostUpdate += AfterAimIK;
    3. }
    4.  
    Then in that function do the stuff you need to do:

    Code (CSharp):
    1. void AfterAimIK() {
    2. // AimIK is done, draw the blue line now
    3. }
    Hi!
    That is one of the most epic bugs with ParticleSystems that we have seen so far. :)
    I think it might have been fixed in the latest patch release.

    Cheers,
    Pärtel
     
  44. montyfi

    montyfi

    Joined:
    Aug 3, 2012
    Posts:
    548
    Some people reports p2 fixed it for them, not for me. Unity promised it to be fixed completely in 5.3.2p1, this or next week.
     
  45. Martin_H

    Martin_H

    Joined:
    Jul 11, 2015
    Posts:
    4,433
    Awesome, I wasn't asking the question but I'll need this exact thing I believe :).

    Thanks for the other answer as well! Sorry to have bothered you about a Unity bug. This is the first time I have encountered it. I hope updating Unity fixes this. Have fun in California!
     
  46. SuperNewbee

    SuperNewbee

    Joined:
    Jun 2, 2012
    Posts:
    196
    Hi,

    Can you please help me. I have spent the last 2 days trying to wrap my mind over my problem. I am using AimIK combined with FBBIK & FBIKHandsOnProp.cs

    I want to have FBBIK turned on all the time so my AI can get hit and has a "hit reaction" but I am stumped on how to engage and disengage the FBIKHandsOnProp.cs script when I change animations(such as when the AI equipts his rifle
    & holsters it)

    If I have FBIKHandsOnProp.cs on my gameobject and start with FBBIK disabled, I wont get hit reactions. Then if I manually turn on FBBIK after my rifle is equipted the FBIKHandsOnProp.cs script kicks in and everything works. But this doesn't help me because I won't have hit reactions in IDLE & other states. Because I can't figure out how to engage/disengage the FBIKHandsOnProp.cs script.

    What is the process for this procedure?
     
  47. giraffe1

    giraffe1

    Joined:
    Nov 1, 2014
    Posts:
    290
    Thanks, that worked.

    I have never used delegates before, just did some reading on them now. I don't fully understand them but I am curious if this method is efficient performance wise? Isn't this delegate bombarding any subscribed scripts with data all the time? Versus requesting the info only when I need it?
     
  48. Partel-Lang

    Partel-Lang

    Joined:
    Jan 2, 2013
    Posts:
    2,523
    They're just about nearly the same as direct calls performance wise. OnPostUpdate gets called each time a solver is done updating so it's once a frame. If you don't need it anymore, you can always unregister with -=

    Cheers,
    Pärtel
     
  49. WendelinReich

    WendelinReich

    Joined:
    Dec 22, 2011
    Posts:
    228
    Yeah that's what I'm doing right now, but of course this stiffens the joint which is skipped. And in the forelegs, this concerns 2 joints because quadrupeds need at least 5 articulated joints in the forelegs to look realistic, so the overall result only looks OK with small movements. So for me, the problem isn't that I don't have a super-generic FBIK solution, but that FBBIK only works with short bone chains. Is that something you would consider changing in the future?
     
  50. kburkhart84

    kburkhart84

    Joined:
    Apr 28, 2012
    Posts:
    910
    I just bought this asset. I've been amazed by it for a while now, but I'm currently working on my first serious project(a modern missile command clone) and though I don't know just how much usage I'll be able to get out of this asset, I'm sure it will be there somewhere, I'm thinking in some of the enemies, aiming before shooting, and maybe some boss tentacles or something. And then I'll have it for other projects where it may be more useful. Once I get some actual usage I will be able to post a review.