Jump to content
This site uses cookies! Learn More

This site uses cookies!

armedunity.com uses cookies to improve user experience.

By continuing to use this site, you agree to allow us to store cookies on your computer.


  • Content Count

  • Joined

  • Last visited

Community Reputation

0 Neutral


About dragonslayer

  • Rank

Profile Information

  • Location:
    Planet Earth

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. In celebration of the announcement of Fallout 4 i'm hosting a jam on Gamejolt for Fallout inspired games. Make a game that is inspired by the Fallout series or takes place in a post-nuclear disaster world. It starts on June 15 and runs for 21 days. Anyone who wants to participate is welcome! Click Here: http://jams.gamejolt.io/falloutinspiredgamejam for details and rules.
  2. Hey guys I just wanted to show you the game I made for the Simulator Jam on GameJolt. Feel free to leave feedback. http://gamejolt.com/games/strategy-sim/tv-watching-simulator-2014/30866/
  3. Can someone help me convert this AI script from CS to JS? I want this script in JS because I don't understand CS. Thanks using UnityEngine; using System.Collections; public class ThirdPersonCharacter : MonoBehaviour { [SerializeField] float jumpPower = 12; // determines the jump force applied when jumping (and therefore the jump height) [SerializeField] float airSpeed = 6; // determines the max speed of the character while airborne [SerializeField] float airControl = 2; // determines the response speed of controlling the character while airborne [Range(1,4)] [SerializeField] public float gravityMultiplier = 2; // gravity modifier - often higher than natural gravity feels right for game characters [SerializeField][Range(0.1f,3f)] float moveSpeedMultiplier = 1; // how much the move speed of the character will be multiplied by [SerializeField][Range(0.1f,3f)] float animSpeedMultiplier = 1; // how much the animation of the character will be multiplied by [SerializeField] AdvancedSettings advancedSettings; // Container for the advanced settings class , thiss allows the advanced settings to be in a foldout in the inspector [System.Serializable] public class AdvancedSettings { public float stationaryTurnSpeed = 180; // additional turn speed added when the player is stationary (added to animation root rotation) public float movingTurnSpeed = 360; // additional turn speed added when the player is moving (added to animation root rotation) public float headLookResponseSpeed = 2; // speed at which head look follows its target public float crouchHeightFactor = 0.6f; // collider height is multiplied by this when crouching public float crouchChangeSpeed = 4; // speed at which capsule changes height when crouching/standing public float autoTurnThresholdAngle = 100; // character auto turns towards camera direction if facing away by more than this angle public float autoTurnSpeed = 2; // speed at which character auto-turns towards cam direction public PhysicMaterial zeroFrictionMaterial; // used when in motion to enable smooth movement public PhysicMaterial highFrictionMaterial; // used when stationary to avoid sliding down slopes public float jumpRepeatDelayTime = 0.25f; // amount of time that must elapse between landing and being able to jump again public float runCycleLegOffset = 0.2f; // animation cycle offset (0-1) used for determining correct leg to jump off public float groundStickyEffect = 5f; // power of 'stick to ground' effect - prevents bumping down slopes. } public Transform lookTarget { get; set; } // The point where the character will be looking at bool onGround; // Is the character on the ground Vector3 lookPos; // The position where the character is looking at float originalHeight; // Used for tracking the original height of the characters capsule collider Animator animator; // The animator for the character float lastAirTime; // USed for checking when the character was last in the air for controlling jumps CapsuleCollider capsule; // The collider for the character const float half = 0.5f; // whats it says, it's a constant for a half Vector3 moveInput; bool crouchInput; bool jumpInput; float turnAmount; float forwardAmount; Vector3 velocity; // Use this for initialization void Start () { animator = GetComponentInChildren<Animator>(); capsule = collider as CapsuleCollider; // as can return null so we need to make sure thats its not before assigning to it if (capsule != null) { originalHeight = capsule.height; capsule.center = Vector3.up * originalHeight * half; } else { Debug.LogError(" collider cannot be cast to CapsuleCollider"); } SetUpAnimator(); } // The Move function is designed to be called from a separate component // based on User input, or an AI control script public void Move (Vector3 move, bool crouch, bool jump, Vector3 lookPos) { // transfer input parameters to member variables. this.moveInput = move; this.crouchInput = crouch; this.jumpInput = jump; this.lookPos = lookPos; // grab current velocity, we will be changing it. velocity = rigidbody.velocity; ConvertMoveInput (); // converts the relative move vector into local turn & fwd values TurnTowardsCameraForward (); // makes the character face the way the camera is looking PreventStandingInLowHeadroom (); // so the character's head doesn't penetrate a low ceiling ScaleCapsuleForCrouching (); // so you can fit under low areas when crouching ApplyExtraTurnRotation(); // this is in addition to root rotation in the animations GroundCheck (); // detect and stick to ground SetFriction (); // use low or high friction values depending on the current state // control and velocity handling is different when grounded and airborne: if (onGround) { HandleGroundedVelocities(); } else { HandleAirborneVelocities(); } UpdateAnimator (); // send input and other state parameters to the animator // reassign velocity, since it will have been modified by the above functions. rigidbody.velocity = velocity; } void ConvertMoveInput () { // convert the world relative moveInput vector into a local-relative // turn amount and forward amount required to head in the desired // direction. Vector3 localMove = transform.InverseTransformDirection (moveInput); turnAmount = Mathf.Atan2 (localMove.x, localMove.z); forwardAmount = localMove.z; } void TurnTowardsCameraForward () { // automatically turn to face camera direction, // when not moving, and beyond the specified angle threshold if (Mathf.Abs (forwardAmount) < .01f) { Vector3 lookDelta = transform.InverseTransformDirection (lookPos - transform.position); float lookAngle = Mathf.Atan2 (lookDelta.x, lookDelta.z) * Mathf.Rad2Deg; // are we beyond the threshold of where need to turn to face the camera? if (Mathf.Abs (lookAngle) > advancedSettings.autoTurnThresholdAngle) { turnAmount += lookAngle * advancedSettings.autoTurnSpeed * .001f; } } } void PreventStandingInLowHeadroom () { // prevent standing up in crouch-only zones if (!crouchInput) { Ray crouchRay = new Ray (rigidbody.position + Vector3.up * capsule.radius * half, Vector3.up); float crouchRayLength = originalHeight - capsule.radius * half; if (Physics.SphereCast (crouchRay, capsule.radius * half, crouchRayLength)) { crouchInput = true; } } } void ScaleCapsuleForCrouching () { // scale the capsule collider according to // if crouching ... if (onGround && crouchInput && (capsule.height != originalHeight * advancedSettings.crouchHeightFactor)) { capsule.height = Mathf.MoveTowards (capsule.height, originalHeight * advancedSettings.crouchHeightFactor, Time.deltaTime * 4); capsule.center = Vector3.MoveTowards (capsule.center, Vector3.up * originalHeight * advancedSettings.crouchHeightFactor * half, Time.deltaTime * 2); } // ... everything else else if (capsule.height != originalHeight && capsule.center != Vector3.up * originalHeight * half) { capsule.height = Mathf.MoveTowards (capsule.height, originalHeight, Time.deltaTime * 4); capsule.center = Vector3.MoveTowards (capsule.center, Vector3.up * originalHeight * half, Time.deltaTime * 2); } } void ApplyExtraTurnRotation () { // help the character turn faster (this is in addition to root rotation in the animation) float turnSpeed = Mathf.Lerp (advancedSettings.stationaryTurnSpeed, advancedSettings.movingTurnSpeed, forwardAmount); transform.Rotate (0, turnAmount * turnSpeed * Time.deltaTime, 0); } void GroundCheck () { Ray ray = new Ray (transform.position + Vector3.up * .1f, -Vector3.up); RaycastHit[] hits = Physics.RaycastAll (ray, .5f); System.Array.Sort (hits, new RayHitComparer ()); if (velocity.y < jumpPower * .5f) { onGround = false; rigidbody.useGravity = true; foreach (var hit in hits) { // check whether we hit a non-trigger collider (and not the character itself) if (!hit.collider.isTrigger) { // this counts as being on ground. // stick to surface - helps character stick to ground - specially when running down slopes if (velocity.y <= 0) { rigidbody.position = Vector3.MoveTowards (rigidbody.position, hit.point, Time.deltaTime * advancedSettings.groundStickyEffect); } onGround = true; rigidbody.useGravity = false; break; } } } // remember when we were last in air, for jump delay if (!onGround) lastAirTime = Time.time; } void SetFriction() { if (onGround) { // set friction to low or high, depending on if we're moving if (moveInput.magnitude == 0) { // when not moving this helps prevent sliding on slopes: collider.material = advancedSettings.highFrictionMaterial; } else { // but when moving, we want no friction: collider.material = advancedSettings.zeroFrictionMaterial; } } else { // while in air, we want no friction against surfaces (walls, ceilings, etc) collider.material = advancedSettings.zeroFrictionMaterial; } } void HandleGroundedVelocities() { velocity.y = 0; if (moveInput.magnitude == 0) { // when not moving this prevents sliding on slopes: velocity.x = 0; velocity.z = 0; } // check whether conditions are right to allow a jump: bool animationGrounded = animator.GetCurrentAnimatorStateInfo (0).IsName ("Grounded"); bool okToRepeatJump = Time.time > lastAirTime + advancedSettings.jumpRepeatDelayTime; if (jumpInput && !crouchInput && okToRepeatJump && animationGrounded) { // jump! onGround = false; velocity = moveInput * airSpeed; velocity.y = jumpPower; } } void HandleAirborneVelocities () { // we allow some movement in air, but it's very different to when on ground // (typically allowing a small change in trajectory) Vector3 airMove = new Vector3 (moveInput.x * airSpeed, velocity.y, moveInput.z * airSpeed); velocity = Vector3.Lerp (velocity, airMove, Time.deltaTime * airControl); rigidbody.useGravity = true; // apply extra gravity from multiplier: Vector3 extraGravityForce = (Physics.gravity * gravityMultiplier) - Physics.gravity; rigidbody.AddForce(extraGravityForce); } void UpdateAnimator () { // Here we tell the animator what to do based on the current states and inputs. // only use root motion when on ground: animator.applyRootMotion = onGround; // update the current head-look position lookPos = Vector3.Lerp (lookPos, lookPos, Time.deltaTime * advancedSettings.headLookResponseSpeed); // update the animator parameters animator.SetFloat ("Forward", forwardAmount, 0.1f, Time.deltaTime); animator.SetFloat ("Turn", turnAmount, 0.1f, Time.deltaTime); animator.SetBool ("Crouch", crouchInput); animator.SetBool ("OnGround", onGround); if (!onGround) { animator.SetFloat ("Jump", velocity.y); } // calculate which leg is behind, so as to leave that leg trailing in the jump animation // (This code is reliant on the specific run cycle offset in our animations, // and assumes one leg passes the other at the normalized clip times of 0.0 and 0.5) float runCycle = Mathf.Repeat (animator.GetCurrentAnimatorStateInfo (0).normalizedTime + advancedSettings.runCycleLegOffset, 1); float jumpLeg = (runCycle < half ? 1 : -1) * forwardAmount; if (onGround) { animator.SetFloat ("JumpLeg", jumpLeg); } // the anim speed multiplier allows the overall speed of walking/running to be tweaked in the inspector, // which affects the movement speed because of the root motion. if (onGround && moveInput.magnitude > 0) { animator.speed = animSpeedMultiplier; } else { // but we don't want to use that while airborne animator.speed = 1; } } void OnAnimatorIK(int layerIndex) { // we set the weight so most of the look-turn is done with the head, not the body. animator.SetLookAtWeight(1, 0.2f, 2.5f); // if a transform is assigned as a look target, it overrides the vector lookPos value if (lookTarget != null) { lookPos = lookTarget.position; } // Used for the head look feature. animator.SetLookAtPosition( lookPos ); } void SetUpAnimator() { // this is a ref to the animator component on the root. animator = GetComponent<Animator>(); // we use avatar from a child animator component if present // (this is to enable easy swapping of the character model as a child node) foreach (var childAnimator in GetComponentsInChildren<Animator>()) { if (childAnimator != animator) { animator.avatar = childAnimator.avatar; Destroy (childAnimator); break; } } } public void OnAnimatorMove() { // we implement this function to override the default root motion. // this allows us to modify the positional speed before it's applied. rigidbody.rotation = animator.rootRotation; if (onGround && Time.deltaTime > 0) { Vector3 v = (animator.deltaPosition * moveSpeedMultiplier) / Time.deltaTime; // we preserve the existing y part of the current velocity. v.y = rigidbody.velocity.y; rigidbody.velocity = v; } } //used for comparing distances class RayHitComparer: IComparer { public int Compare(object x, object y) { return ((RaycastHit)x).distance.CompareTo(((RaycastHit)y).distance); } } }
  4. Joey I did post this already but I posted this in off topic and I thought I should post it as a tutorial
  5. Hey guys, I just posted a youtube video on how to make a creepy forest in unity. It's pretty simple but I thought it might help people out. Feel free to give me feedback/ criticism if you want https://www.youtube.com/watch?v=2kK5ePQ-j0o&list=UU6y0_xUA0HMN1vrapFoOk0A
  6. Hey guys, I just posted a youtube video on how to make a creepy forest in unity. It's pretty simple but I thought it might help people out. Feel free to give me feedback/ criticism if you want http://www.youtube.com/watch?v=2kK5ePQ-j0o&list=UU6y0_xUA0HMN1vrapFoOk0A
  7. Hey guys, I've been trying to add mecanim and nav mesh to the AI script in the fps kit. I am confused on what to add and what to remove. If you guys can help me out this will help my project out a bunch. Thanks var moveSpeed = 3; //move speed var rotationSpeed = 3; //speed of turning var attackRange = 3; // distance within which to attack var chaseRange = 10; // distance within which to start chasing var giveUpRange = 20; // distance beyond which AI gives up var attackRepeatTime : float = 1.5; // delay between attacks when within range var anim : GameObject; var maximumHitPoints = 5.0; var hitPoints = 5.0; var attack : AudioClip; private var chasing = false; private var attackTime : float; var checkRay : boolean = false; var idleAnim : String = "idle"; var walkAnim : String = "walk"; var attackAnim : String = "attack"; var dontComeCloserRange : int = 4; private var myTransform : Transform; //current transform data of this enemy function Awake(){ myTransform = transform; //cache transform data for easy access/preformance anim.animation.wrapMode = WrapMode.Loop; anim.animation[attackAnim].wrapMode = WrapMode.Once; anim.animation[attackAnim].layer = 2; anim.animation.Stop(); } function Start(){ target = GameObject.FindWithTag("Player").transform; } function Update () { // check distance to target every frame: var distance = (target.position - myTransform.position).magnitude; if (distance < dontComeCloserRange){ moveSpeed = 0; anim.animation[idleAnim].speed = .4; anim.animation.CrossFade(idleAnim); }else{ moveSpeed = Random.Range(4, 6); anim.animation.CrossFade(walkAnim); } if (chasing) { //move towards the player myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime; //rotate to look at the player myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime); transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0); // give up, if too far away from target: if (distance > giveUpRange) { chasing = false; } // attack, if close enough, and if time is OK: if (distance < attackRange && Time.time > attackTime) { anim.animation[attackAnim].speed = 2.0; anim.animation.CrossFade(attackAnim); target.SendMessage( "PlayerDamage", maximumHitPoints); attackTime = Time.time + attackRepeatTime; audio.PlayOneShot(attack, 1.0 / audio.volume); } } else { // not currently chasing. anim.animation[idleAnim].speed = .4; anim.animation.CrossFade(idleAnim); // start chasing if target comes close enough if (distance < chaseRange) { chasing = true; } } } function OnDrawGizmosSelected (){ Gizmos.color = Color.yellow; Gizmos.DrawWireSphere (transform.position, attackRange); Gizmos.color = Color.red; Gizmos.DrawWireSphere (transform.position, chaseRange); }
  8. Hey im making a zombie survival game with the fps kit and Im trying to make the map. I want to make a big map similar in style to dayz (but not as big or good looking). I have some models but I have no experience in level design or map making. Any tips, advice, or instruction would be great, Thanks!
  9. Oh thanks that makes a lot more sense.
  10. Wait im confused, What function would it do?
  11. Im making a game using the fps kit 1.3.5 and I saw this thing called nav mesh for npc navigation in unity. Is there any way I can use this to make the zombie AI avoid obstacles? Thanks
  12. Ive tried changing the speed var in public but it does nothing
  13. I want (When the fps kit 1.3.5 zombie is idle) the zombie to walk around randomly when the zombie has no target in sight. Also when I change the move speed of the AI script in the inspector it still keeps the speed for the zombie the same.
  • Create New...