Search Unity

[Released] Kinematic Character Controller

Discussion in 'Assets and Asset Store' started by PhilSA, Sep 29, 2017.

  1. Kerrjgan

    Kerrjgan

    Joined:
    May 30, 2016
    Posts:
    10
    Hey! I was wondering if you had any examples or pointers on how to use the PhysicsMover with an animator that does not use a Playable Director. Simply just an animation / Animator? Thank you.
     
  2. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    Normally, there should be no ground snapping if the angle is over MaxSlopeAngle. Could you show me a gif/video of what's happening?
     
  3. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    I'd suggest arranging things so that your SuperJumpState is a state that you enter whenever you jump from the default state (so the jumping logic would stay in default state), and that you exit whenever you land on ground
     
  4. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    This could be done by having 2 separate gameObjects representing your platform;
    • The first one is the platform with an Animator on it that makes it move regularly without any special considerations
    • The second one is the physics representation of the platform, so this is the object that has a rigidbody, collider, PhysicsMover and a "MyMovingPlatform" equivalent on it. The "MyMovingPlatform" would simply set its goalPosition/Rotation to the pose of the first gameobject on each of its UpdateMovement() calls
     
  5. thestrandedmoose

    thestrandedmoose

    Joined:
    Jul 21, 2015
    Posts:
    70
    Hey Phil- totally noob question but I'm finally reaching the point where I'm adding animations to my character. Where do you recommend placing the animation code? Should I create a new script dedicated for animation or put it in the MyCharacterController or KinematicCharacterController script or MyPlayer Script?
    I'm guessing I would want to put it in MyCharacterController or create a new script altogether, but I wanted to see what you recommend
     
  6. FenixOfGreen

    FenixOfGreen

    Joined:
    Oct 2, 2017
    Posts:
    22
    Btw the gliding is not a separate state, just changes the gravity after the second jump. But when im gliding and touching the slope i try pushing away from it but it sticks.
     

    Attached Files:

  7. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    Both options are good, really (new script or in MyCharacterController). But personally I'd go with a new script that handles just animation
     
    thestrandedmoose likes this.
  8. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    Are you sure it's not just that the gravity pulls your character towards the slope faster than it can move away from it? What happens if you make the gravity much lower?
     
  9. FenixOfGreen

    FenixOfGreen

    Joined:
    Oct 2, 2017
    Posts:
    22
    Fixed it, just have to create a IsGliding bool for when gliding and apply it to to Prevent Climbing in the air controls

    Code (CSharp):
    1.                                 // Prevent climbing on un-stable slopes with air movement
    2.                                 if (Motor.GroundingStatus.FoundAnyGround && IsGliding == false)
    3.                                 {
    4.                                     Vector3 perpenticularObstructionNormal = Vector3.Cross(Vector3.Cross(Motor.CharacterUp, Motor.GroundingStatus.GroundNormal), Motor.CharacterUp).normalized;
    5.                                     targetMovementVelocity = Vector3.ProjectOnPlane(targetMovementVelocity, perpenticularObstructionNormal);
    6.                                 }
     
  10. FenixOfGreen

    FenixOfGreen

    Joined:
    Oct 2, 2017
    Posts:
    22
    So, Any idea why this is happening?
     

    Attached Files:

  11. thestrandedmoose

    thestrandedmoose

    Joined:
    Jul 21, 2015
    Posts:
    70
    Cool thank you!
     
  12. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    Is your RigidbodyInteractionType set to "Simulated Dynamic" on the motor?
     
    jamesdibnah likes this.
  13. FenixOfGreen

    FenixOfGreen

    Joined:
    Oct 2, 2017
    Posts:
    22
    ahhh thank you
     
  14. Kerrjgan

    Kerrjgan

    Joined:
    May 30, 2016
    Posts:
    10
    Hey. I'm trying to figure out why when I change directions (left to right) or (forward to backwards) for a split second the movement velocity reaches 0? This has big implications with my animation controller that is currently reading the Motor.Velocity variable for speed changes.

    As you can see from the gifv below, as I change directions the current velocity goes from (4 in this example) to 2.x and the back to 4, and this messes with the characters animation blend tree. That's why you see the jump of animation as he stands up.. Any ideas? Thanks!

    https://imgur.com/a/8QCZLO2
     
  15. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    The velocity reaches 0 at some point because when doing a direction change with an acceleration that is not infinity, the character necessarily has to shift its move vector in the opposite direction, which means it'll go through 0 at some point.

    I think the solution here is to keep that in mind when designing your blend tree. For example, at velocity zero, there could be an idle anim
     
    Last edited: Jul 20, 2018
  16. sebsmax

    sebsmax

    Joined:
    Sep 8, 2015
    Posts:
    118

    Sorry to jump in like that, but why don't you do something like this (it's pseudo code)

    AnimVelocitiyX = Mathf.Max(Mathf.abs(rb.velocity.x), inputAxesX*0.1f)*Mathf.Sign(rb.velocity.x))
     
  17. Bubsavvy

    Bubsavvy

    Joined:
    Sep 18, 2017
    Posts:
    48
    Okay so our team has run into a bit of a problem with the Kinematic Motor. We are trying to get the player to rotate around a gameobject smoothly, but our current solution produces jumpy behavior. Currently we use GetVelocityForMovePosition where the first parameter is the player position, second is a point calculated using trig formula :
    //x = cx + r * cos(a)
    //y = cy + r * sin(a)

    and third is deltaTime in UpdateVelocity. We otherwise would simply use Unity's built in RotateAround but the Motor does not seem to allow direct modification of transform vectors. Has anyone come up with an orbiting solution that is similar and working that our team might be able to leverage?
     
  18. apexsoftworks

    apexsoftworks

    Joined:
    Oct 5, 2016
    Posts:
    29
    Hey,

    Just bought KCC. Looks great so far. I had a question about mutliplayer networking.

    I am using Forge as the backend. According to the docs I just need to modify OnlineSession.cs to use Forge's API. I'm just not sure where to even start with getting this converted. Would you be able to give me any pointers to help me get started?

    Thanks,

    - Tate
     
  19. Jumplion

    Jumplion

    Joined:
    Jul 4, 2014
    Posts:
    1
    Hey there @PhilSA, a bunch of my friends recommended me Kinematic Character Controller and looking through the documents, forums, videos, etc... it looks to be pretty much 80% of what I need (and that moving platform implementation is just *chef kiss* perfect) but I'm a bit hesitant to jump in just yet.

    I'm trying to do a Tony Hawk/SSX type of skateboard/snowboard/extreme movement type of game, and my biggest hurdles so far have been ground orientation and transferring the player from ground to air. Ground orientation is a cakewalk with KCC, and it seems capable of having the behavior I'm looking with the right programming (I.E. when you jump right before the apex of a ramp with a 90 degree drop-off, it gives that feeling of skating off it), but from what I've read and seen it pretty diligently keeps the player grounded even on small bumps that would otherwise bounce them to the air.

    Maybe I'm overthinking it or over complicating how to implement this in KCC? I'm imagining there a sort of "stickiness" or "ground check distance" variable I'd have to fiddle with to make this sort of behavior happen, but it might be as simple as just working by virtue of keeping the velocity consistent as opposed to player-controlled like in the demo (air-control seems to impact the character much less than on ground, so that might explain it).

    Regardless, the plugin looks great and I'll probably pick it up in a few days regardless for future projects. Keep up the great work!
     
  20. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    You could follow these steps to calculate an orbit:
    • Calculate quaternion Q that represents this frame's rotation: Quaternion.Euler(Vector3.up * a * deltaTime)
    • New character position is: orbitCenter + (Q x (characterPos - orbitCenter))
    • Use GetVelocityForMovePosition to move to that position
     
  21. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    OnlineSession's role is to handle connecting, sending and receiving messages. Converting it would mean removing all Unet LLAPI functions and replacing them with an equivalent in Forge API

    However, do keep in mind that this entire networking example is more of an educational thing than a real production-ready networking framework. It tells you how to network KCC correctly, but the actual network system made to demonstrate this is very rudimentary
     
  22. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    The example character in KCC comes with a built-in variable ("Max Stable Denivelation Angle") representing the angle of denivelation that causes you to "jump off" a slope. Setting this to the min value will do what you want
     
    Jumplion likes this.
  23. snacktime

    snacktime

    Joined:
    Apr 15, 2013
    Posts:
    3,356
    What is the simplest/most direct way to bypass all simulation and move the controller manually? Like similar to what you do for moving remote controllers in your own networking stuff.
     
  24. Guacamolay

    Guacamolay

    Joined:
    Jun 24, 2013
    Posts:
    63
    In certain situations I want to rotate my character around it's centre rather than around it's feet which is the capsules pivot. What is the best way to achieve this? My capsule Y-Offset is currently 1, should I set it to zero and just move my child objects (mesh objects etc.) down by one on the Y axis? I'd definitely prefer a solution for rotating around a defined axis though as having the characters pivot at its feet is easier for positioning the character on the ground or other objects
     
    Last edited: Jul 8, 2018
  25. filod

    filod

    Joined:
    Oct 3, 2015
    Posts:
    224
    Wondering are u going to ship a ECS version of this asset?
     
  26. DanielSnd

    DanielSnd

    Joined:
    Sep 4, 2013
    Posts:
    382
    Hi there, I was wondering if there is a way for one Kinematic Character Controller to stand on top of another Kinematic Character Controller and be moved by the movements of the kinematic Character Controller that is underneath. I tried to do something with the Physics Mover but it seems to crash with all my attempts :/
     
  27. Karkazaz

    Karkazaz

    Joined:
    Mar 11, 2014
    Posts:
    32
    How would one implement a ladder that you can walk up to and start climbing on touch? I tried to use OnCollisionEnter but that would not work since the rigidbody is kinematic.
     
  28. DanielSnd

    DanielSnd

    Joined:
    Sep 4, 2013
    Posts:
    382
    There's a ladder example that comes with the walkthroughs, did you check that out?
     
  29. Bamfax

    Bamfax

    Joined:
    Jun 12, 2016
    Posts:
    52
    I also got KCC and it is amazing. A few minutes of reading until first charcontroller is done, rocksolid collision detection even at high speeds. Many thanks Phil for this great asset and all your effort!

    Has anyone had success integrating it with Puppetmaster asset (https://forum.unity.com/threads/puppetmaster-advanced-character-physics-tool-released.358445/) or syncing the character transform to other objects outside the character child hierarchy?
    Transferring the position to other objects seems not to be in sync by default, at least for the other objects, which are not under the character child hierarchy. Upon character movement, these objects are first lagging behind, then catching up, and so on. This happens using Puppetmaster in its default setup, or when dragging other object behind via joints, or also when simply transferring motion by simply copying the character transform.position (in FixedUpdate() or Update(), etc.)

    I would greatly appreciate your thoughts on that - thank you.
    KCCwithPuppetmaster.gif
     
    Last edited: Jul 13, 2018
  30. Karkazaz

    Karkazaz

    Joined:
    Mar 11, 2014
    Posts:
    32
    Yes I did, but I want to "activate" climbing mode by just touching the ladder. Like the ladders we see in fast paced FPS games like counter-strike or crossfire.

    If I walk up to it, while facing forward, I should start moving upwards the ladder.
    And if I move backwards while on the ladder I should go downwards.


    Here is a good example of how ladders works in counter-strike:
     
  31. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    First you can simply disable the KinematicCharacterMotor script (motor.enabled = false), and then move the character with motor.SetPositionAndRotation()
     
  32. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    The most direct way to do this is with a Y Offset of zero, yes. But it's possible to accomplish it with any offset with a bit of math:
    • Lets say you want to rotate the character by "r = Quaternion.Euleur(15, 10, 30);" around a point "p" (in this case, p would be the capsule center)
    • Do "motor.SetRotation(r);"
    • Do "motor.SetPosition(p + (r * (motor.TransientPosition - p)));"
    (this is untested, but I think that should do it)
     
    Guacamolay likes this.
  33. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    It's something I want to do, but not right now. I'm waiting for the ECS to gain more maturity first
     
    hippocoder likes this.
  34. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    I can think of a way to make this work, but I haven't tested it:
    1. when you detect that characterMotorA is stable on characterMotorB, do "characterMotorA.
      AttachedRigidbodyOverride = characterMotorB.Rigidbody;"
    2. ...and when you are not on it anymore, do "characterMotorA.
      AttachedRigidbodyOverride = null;"
    3. The AttachedRigidbody mechanic of the motor uses that rigidbody's .velocity and .angularVelocity to make the character follow it. So just make sure your characters always set those to the right values. That means that in
      AfterCharacterUpdate(), just set "motor.Rigidbody.velocity = motor.Velocity" and "motor.Rigidbody.angularVelocity = whateverYourAngVelocityIs"
     
  35. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    In the ladder example of the walkthrough, I think I used a motor.CharacterOverlap() on every update to detect ladders.

    But another thing that would work is to detect ladders in OnMovementHit() of your characterController script
     
    Last edited: Jul 19, 2018
  36. PhilSA

    PhilSA

    Joined:
    Jul 11, 2013
    Posts:
    1,926
    I could be wrong, but this looks a lot like an interpolation issue. Can you verify if the Puppetmaster rig has interpolation activated? It's possible you'll need to check with the author to see if it has to be interpolated in a special way

    If you want to confirm whether it's an interpolation issue or not: go to Edit > Project Settings > Time and set "Fixed Timestep" to 0.005. This is the equivalent of making your physics run at a fixed 200 fps, which is no doubt higher than your screen's maximum refresh rate. If the problem disappears with this test, it's definitely an interpolation issue. Be sure to put the Fixed Timestep back to 0.02 after this, otherwise your performance will blow up
     
  37. Karkazaz

    Karkazaz

    Joined:
    Mar 11, 2014
    Posts:
    32
    I have a question about the networked example. I am currently trying to understand the whole thing and I got a couple of questions for you.
    1. Why is the ConnectionInfo holding a list of PlayerControllers? Why would I want to be able to control more than one character controller? Or maybe I mistake that for something else?

    2. Since I will be using https://github.com/lidgren/lidgren-network-gen3 as for the networking, I will need to calculate the "ticksFromNetworkDelay" differently. Is the following code the "correct" way of calculating the delay?
      https://github.com/lidgren/lidgren-.../Lidgren.Network/NetConnection.Latency.cs#L18
      Code (CSharp):
      1. int ticksFromNetworkDelay = Mathf.FloorToInt(connection.AverageRoundtripTime * 0.001f / Time.fixedDeltaTime);
      2.  
      3. // We want to be one half RTT ahead of server in terms of ticks
      4. SimulationSystem.InitializeAtTick(msg.Tick + ticksFromNetworkDelay + ticksFromNetworkDelay);

    3. I want to be able to tell the server what tickrate is should have. Is it correct if I more or less replace Time.fixedDeltaTime with a tickrate parameter?

    4. The TickSync message is a question to the client to tell if they are ready for the game to start?
     
  38. Bamfax

    Bamfax

    Joined:
    Jun 12, 2016
    Posts:
    52
    Hi Phil, thank you for your answer. Following your hint, it does not seem to be an interpolation issue - turning up the timestep exhibits the same behavior, no noticeable difference.

    What I am looking for is a method to pull a rigidbody with the KCC character. Through any means, be it via a joint as child of KCC, could also be indirect with syncing transforms, or AddForce(). The only important part is that it stays attached to the KCC character and in sync with its movement. This is meant to achieve character limbs being affected by acceleration, physically animated.
    The barebones test setup in the video below is a the KCC character parenting a joint which attaches to some test rigidbodies and pulls them along. These pulled test rigidbodies then jitter a lot, depending on speed. Crosschecking against a very simple character controller, this does not show this behavior.

    The video shows this effect. Bottom left is the KCC from the example scene, in the middle my own KCC and on the top right the simple character controller (yellow). The simple CC and the rigidbodies are moving in sync, the KCC's seem to be using a somewhat different step. The resulting quirk is seeing this jumpy ridigbody movement, when seen from the KCC perspective (from that perspective it is the other way around - KCC is stable and the rigidbodies jump around).

    So I am kind of wondering where that is coming from and what the best approach would be to keep the KCC character and the rigidbodies moving in sync.

    Troubleshoot_KCC_RigidbodyPull.gif
     
  39. Bamfax

    Bamfax

    Joined:
    Jun 12, 2016
    Posts:
    52
    Is anyone using KCC for implementing a VR character already? If yes, how to you handle the controllers?
     
  40. Shturmovik

    Shturmovik

    Joined:
    Nov 5, 2014
    Posts:
    29
    Getting these two (apparently completely harmless) compiler warnings after upgrade to 2.3.0:

    Assets/KinematicCharacterController/Core/KinematicCharacterMotor.cs(896,45): warning CS0219: The variable `originalResolutionDirection' is assigned but its value is never used
    Assets/KinematicCharacterController/Core/KinematicCharacterMotor.cs(1130,45): warning CS0219: The variable `originalResolutionDirection' is assigned but its value is never used

    Have now commented out the offending lines to keep my console clean, but just thought I'd mention it - and loving this system to bits, BTW! :)
     
  41. Elyaradine

    Elyaradine

    Joined:
    Aug 13, 2015
    Posts:
    27
    I used this in a game jam recently, and it's helpful, thanks! :) It was nice that it came with a basic camera too, making prototyping much easier than it would've been otherwise.

    One thing that I'd like to be able to do that I haven't figured out is to get the character to slide down something with a ramp at the end (i.e. preserve the momentum/velocity that they build going down the slope, and using that to shoot up off a ramp).

    In particular:

    1. While going down a ramp, if I hold any direction (including in the direction that I'm currently moving down the slope), my speed decreases. I think that it's because the max velocity gets clamped, but only when I'm using input. It doesn't get clamped when I'm just sliding down the slope. I would imagine that there would be two max velocities: one would apply to how much your input can actually add to velocity (if you're already moving faster than that, your input doesn't contribute in that direction any more, but you don't slow down), and one that acts like terminal velocity (where if you're moving faster than that, you do get slowed).

    2. I was hacking the slide thing by setting the Max Stable Slope Angle to 0 at the beginning of the slide, and setting it back to whatever it was (usually 50) after the ramp, but sometimes at the bottom of a slope I'd sometimes lose all of my velocity.

    I was in a game jam, so I had time pressure and will give this another look in the coming week, but if it's something KCC can already do that I've just missed, that'd be great! :)
     
  42. DanielSnd

    DanielSnd

    Joined:
    Sep 4, 2013
    Posts:
    382

    Github seems to not like my prefabs that have Kinematic Character Controller. It constantly says it changed just a little bit the m_LocalRotation. Has anyone experienced that and found a way to make it stop? The more NPCs I add the more annoying it gets with more and more merge conflicts happening all the time ._.
     
  43. daville

    daville

    Joined:
    Aug 5, 2012
    Posts:
    303
    Hi, I'm just using this, and I want to make a character controlled by Root Motion... I have two questions

    - How to implement the Jump? (when I call the Jump animation, it jumps in ground level, it doesn't go up and down)
    - What's the right way to teleport or hardcode position the character at a specific position? when I try to change it, next frame it goes back to the previous place.
     
  44. Bubsavvy

    Bubsavvy

    Joined:
    Sep 18, 2017
    Posts:
    48
    As for question 1 I would take a look at how the ExampleCharacterController is being handled provided as part of the plugin. For the most part it is all state based and you have to manipulate movements from the actual MotorCallbacks like UpdateVelocity or the UpdateRotation implemented by the abstract class BaseCharacterController. Question 2 is available via the cc.Motor.SetPositionAndRotation(TeleportTo.transform.position, TeleportTo.transform.rotation) function provided by the character motor.
     
    daville likes this.
  45. Bubsavvy

    Bubsavvy

    Joined:
    Sep 18, 2017
    Posts:
    48
    Since the 2018.2.1f1 update I have been having similar issues as @katumplet. The issue seems to be related to the Motor and causes unexpected behavior with our character's rigidbody causing mesh stretching as well as the inability to even move via the Motor. I'm not sure if there was an update to Unity's Physics engine or what that is causing this but we receive AABB errors as soon as we run the Motor.SetPositionAndRotation function claiming that the characters transform position and rotation properties are either NaN or Infinity. Whilst doing research I found that this error is usually due to the player being to far from the scene, but that is by no means the case here. Not to mention even before the motor is even used as well as before the error the mesh is still stretching and behaving strangely whilst the character performs his idle animations hidden from our timeline intro scene using the playable director. Any thoughts? I will post screen caps and a video with evidence of what is occurring tomorrow when i get the chance. EDIT : @PhilSA sorry took so long for images but here it is.


     
    Last edited: Aug 5, 2018
  46. holdingjason

    holdingjason

    Joined:
    Nov 14, 2012
    Posts:
    135
    2nd Update: Ok yes the solution below did it, though did not even require as much as that. Was just being thick about it. Basically just create the deck as a separate object and dont have it touch the boat collider that is just under it. Worked like a dream at that point.

    I have an issue with walking around on a boat. The boat uses a non kinematic rigidbody with gravity. Mass is around 20000. It is floating on an ocean dynamically being pushed up by force calls (Dynamic Water Physics https://assetstore.unity.com/packages/tools/physics/dynamic-water-physics-89928)

    Placing the player on the deck causes the boat to behavior badly. The players downward force is effecting the boat causing it to lean a lot and slow down etc. Basically would like the player while walking around on this moving platform to not interfere with it in anyway. I have tried setting the rigidbody interaction type to none etc but so far no luck. It appears as long as the rigidbody is kinematic on the player bad things happen. All the examples of moving platforms in the demo so far use a kinematic rigidbody and physics mover.

    Perhaps that is the solution though and change to the boat would still need to allow for some form of gravity force down and the ability to apply force up similar to AddForceAtPosition.

    I will look into the physics mover but figured I should drop a note as well and check with you on the proper way to handle this. Thanks.

    Update: May have found the solution from this post. I still want to make sure that the player does not interfere with the force movements etc of the cube in anyway. Will give that a try let me know if there is a newer way to do this or if this is the correct approach. Thanks

    https://forum.unity.com/threads/released-kinematic-character-controller.497979/page-2#post-3267702
     
    Last edited: Aug 9, 2018
  47. holdingjason

    holdingjason

    Joined:
    Nov 14, 2012
    Posts:
    135
    Hi. Great product btw. Had another question around swimming. The only issue I am running into right now is I don't want to use the Orbit Camera but instead one based on the WowCamera script. That works fine when running around but when trying to swim all the pivots come from the character feet (where the pivot point is). This makes sense however I really want it to work from the character stomach while prone which would be more of a center pivot. Interesting when I use the Orbit Camera that does it when the character goes prone in the water. (using the script changes to swimming and orbit camera that you mentioned in a previous post). So with those changes and using the orbit camera everything is great. Do you have some idea on how I would get this working without using the orbit camera? Thanks.
     
  48. holdingjason

    holdingjason

    Joined:
    Nov 14, 2012
    Posts:
    135
    Hmm did we lose @PhilSA. Been awhile since I have seen him reply to post.
     
  49. snacktime

    snacktime

    Joined:
    Apr 15, 2013
    Posts:
    3,356
    Re boats, non kinematic won't work well. It will never interact correctly with the controller in that scenario. If you stick with a non kinematic boat the best solution I found is have a non kinematic invisible hull, just shape it to give the best buoyancy effect. The model wraps that and is kinematic with a physics mover attached. The model is NOT a child of the hull you just move it separately to match the hull position.
     
    Vincent454 likes this.
  50. rxmarccall

    rxmarccall

    Joined:
    Oct 13, 2011
    Posts:
    353
    @PhilSA Does your asset come with full source code? I'm mostly interested in understanding how you built your character controller.