- Home /
Question by
JakMesh · Oct 03, 2015 at 10:46 PM ·
unity 5scripting problemrunning
Characterdoesn't run on Aiming mode
i hope i can find a help from anyone as soon as possible.
i have this assets that im working from it, in other project, and i wants the cherecter to be able to run while in Aiming mode, but seem it doesn't work, i tried to add some function to it, but also it did not work, i hope i can find someone to help me figure it out.
using UnityEngine;
using System.Collections;
public class PlayerControl : MonoBehaviour
{
public float walkSpeed = 0.15f;
public float runSpeed = 1.0f;
public float sprintSpeed = 2.0f;
public float flySpeed = 4.0f;
public float turnSmoothing = 3.0f;
public float aimTurnSmoothing = 15.0f;
public float speedDampTime = 0.1f;
public float jumpHeight = 5.0f;
public float jumpCooldown = 1.0f;
private float timeToNextJump = 0;
private float speed;
private Vector3 lastDirection;
private Animator anim;
private int speedFloat;
private int jumpBool;
private int hFloat;
private int vFloat;
private int aimBool;
private int flyBool;
private int groundedBool;
private Transform cameraTransform;
private float h;
private float v;
private bool aim;
private bool run;
private bool sprint;
private bool isMoving;
// fly
private bool fly = false;
private float distToGround;
private float sprintFactor;
void Awake()
{
anim = GetComponent<Animator> ();
cameraTransform = Camera.main.transform;
speedFloat = Animator.StringToHash("Speed");
jumpBool = Animator.StringToHash("Jump");
hFloat = Animator.StringToHash("H");
vFloat = Animator.StringToHash("V");
aimBool = Animator.StringToHash("Aim");
// fly
flyBool = Animator.StringToHash ("Fly");
groundedBool = Animator.StringToHash("Grounded");
distToGround = GetComponent<Collider>().bounds.extents.y;
sprintFactor = sprintSpeed / runSpeed;
}
bool IsGrounded() {
return Physics.Raycast(transform.position, -Vector3.up, distToGround + 0.1f);
}
void Update()
{
// fly
if(Input.GetButtonDown ("Fly"))
fly = !fly;
aim = Input.GetButton("Aim");
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical");
run = Input.GetButton ("Run");
sprint = Input.GetButton ("Sprint");
isMoving = Mathf.Abs(h) > 0.1 || Mathf.Abs(v) > 0.1;
}
void FixedUpdate()
{
anim.SetBool (aimBool, IsAiming());
anim.SetFloat(hFloat, h);
anim.SetFloat(vFloat, v);
// Fly
anim.SetBool (flyBool, fly);
GetComponent<Rigidbody>().useGravity = !fly;
anim.SetBool (groundedBool, IsGrounded ());
if(fly)
FlyManagement(h,v);
else
{
MovementManagement (h, v, run, sprint);
JumpManagement ();
}
}
// fly
void FlyManagement(float horizontal, float vertical)
{
Vector3 direction = Rotating(horizontal, vertical);
GetComponent<Rigidbody>().AddForce(direction * flySpeed * 100 * (sprint?sprintFactor:1));
}
void JumpManagement()
{
if (GetComponent<Rigidbody>().velocity.y < 10) // already jumped
{
anim.SetBool (jumpBool, false);
if(timeToNextJump > 0)
timeToNextJump -= Time.deltaTime;
}
if (Input.GetButtonDown ("Jump"))
{
anim.SetBool(jumpBool, true);
if(speed > 0 && timeToNextJump <= 0 && !aim)
{
GetComponent<Rigidbody>().velocity = new Vector3(0, jumpHeight, 0);
timeToNextJump = jumpCooldown;
}
}
}
void MovementManagement(float horizontal, float vertical, bool running, bool sprinting)
{
Rotating(horizontal, vertical);
if(isMoving)
{
if(sprinting)
{
speed = sprintSpeed;
}
else if (running)
{
speed = runSpeed;
}
else
{
speed = walkSpeed;
}
anim.SetFloat(speedFloat, speed, speedDampTime, Time.deltaTime);
}
else
{
speed = 0f;
anim.SetFloat(speedFloat, 0f);
}
GetComponent<Rigidbody>().AddForce(Vector3.forward*speed);
}
Vector3 Rotating(float horizontal, float vertical)
{
Vector3 forward = cameraTransform.TransformDirection(Vector3.forward);
if (!fly)
forward.y = 0.0f;
forward = forward.normalized;
Vector3 right = new Vector3(forward.z, 0, -forward.x);
Vector3 targetDirection;
float finalTurnSmoothing;
if(IsAiming())
{
targetDirection = forward;
finalTurnSmoothing = aimTurnSmoothing;
}
else
{
targetDirection = forward * vertical + right * horizontal;
finalTurnSmoothing = turnSmoothing;
}
if((isMoving && targetDirection != Vector3.zero) || IsAiming())
{
Quaternion targetRotation = Quaternion.LookRotation (targetDirection, Vector3.up);
// fly
if (fly)
targetRotation *= Quaternion.Euler (90, 0, 0);
Quaternion newRotation = Quaternion.Slerp(GetComponent<Rigidbody>().rotation, targetRotation, finalTurnSmoothing * Time.deltaTime);
GetComponent<Rigidbody>().MoveRotation (newRotation);
lastDirection = targetDirection;
}
//idle - fly or grounded
if(!(Mathf.Abs(h) > 0.9 || Mathf.Abs(v) > 0.9))
{
Repositioning();
}
return targetDirection;
}
private void Repositioning()
{
Vector3 repositioning = lastDirection;
if(repositioning != Vector3.zero)
{
repositioning.y = 0;
Quaternion targetRotation = Quaternion.LookRotation (repositioning, Vector3.up);
Quaternion newRotation = Quaternion.Slerp(GetComponent<Rigidbody>().rotation, targetRotation, turnSmoothing * Time.deltaTime);
GetComponent<Rigidbody>().MoveRotation (newRotation);
}
}
public bool IsFlying()
{
return fly;
}
public bool IsAiming()
{
return aim && !fly;
}
public bool isSprinting()
{
return sprint && !aim && (isMoving);
}
}
Comment
Your answer
Follow this Question
Related Questions
enable and disable script on Unity gameobject 0 Answers
[Help!]Unity FPS Health script error. 1 Answer
Sprite image not changing 0 Answers
Animation Loop 1 Answer