113 lines
3.6 KiB
C#
113 lines
3.6 KiB
C#
![]() |
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace FIMSpace.Generating
|
|||
|
{
|
|||
|
public class SimpleWSADMovement : MonoBehaviour
|
|||
|
{
|
|||
|
public static SimpleWSADMovement Instance;
|
|||
|
private void Awake()
|
|||
|
{
|
|||
|
Instance = this;
|
|||
|
}
|
|||
|
|
|||
|
public float Speed = 10f;
|
|||
|
public GameObject Projectile;
|
|||
|
public float ProjectileSpeed = 5f;
|
|||
|
public bool FreezeGravity = true;
|
|||
|
public bool JumpOnSpace = false;
|
|||
|
|
|||
|
void Start()
|
|||
|
{
|
|||
|
rig = GetComponent<Rigidbody>();
|
|||
|
}
|
|||
|
|
|||
|
private Rigidbody rig;
|
|||
|
private Vector3 translation;
|
|||
|
private Quaternion tgtRotation;
|
|||
|
private float sd_acc = 0f;
|
|||
|
private float acceleration = 0f;
|
|||
|
private float triggerJump = 0f;
|
|||
|
|
|||
|
|
|||
|
void Update()
|
|||
|
{
|
|||
|
Vector3 moveDir = Vector3.zero;
|
|||
|
|
|||
|
if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W)) moveDir += Vector3.forward;
|
|||
|
if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S)) moveDir += Vector3.back;
|
|||
|
if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A)) moveDir += Vector3.left;
|
|||
|
if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)) moveDir += Vector3.right;
|
|||
|
|
|||
|
if (JumpOnSpace)
|
|||
|
{
|
|||
|
if (Input.GetKeyDown(KeyCode.Space))
|
|||
|
triggerJump = 3f;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (Input.GetKey(KeyCode.Space) || Input.GetMouseButtonDown(0))
|
|||
|
CreateProjectile();
|
|||
|
}
|
|||
|
|
|||
|
if (moveDir != Vector3.zero)
|
|||
|
{
|
|||
|
moveDir.Normalize();
|
|||
|
moveDir = Vector3.ProjectOnPlane(Camera.main.transform.TransformDirection(moveDir), Vector3.up).normalized;
|
|||
|
|
|||
|
|
|||
|
acceleration = Mathf.SmoothDamp(acceleration, 1f, ref sd_acc, 0.1f, 10000f, Time.deltaTime);
|
|||
|
|
|||
|
tgtRotation = Quaternion.LookRotation(moveDir);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
acceleration = Mathf.SmoothDamp(acceleration, 0f, ref sd_acc, 0.1f, 10000f, Time.deltaTime);
|
|||
|
}
|
|||
|
|
|||
|
float speed = Speed;
|
|||
|
if (Input.GetKey(KeyCode.LeftShift)) speed *= 2f;
|
|||
|
translation = (moveDir * speed * acceleration);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void CreateProjectile()
|
|||
|
{
|
|||
|
if (Projectile == null) return;
|
|||
|
GameObject pr = GameObject.Instantiate(Projectile);
|
|||
|
|
|||
|
Vector3 target = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Vector3.Distance(Camera.main.transform.position, transform.position)));
|
|||
|
Vector3 dir = Vector3.ProjectOnPlane(target - transform.position, Vector3.up);
|
|||
|
dir.Normalize();
|
|||
|
|
|||
|
pr.transform.position = transform.position + Vector3.up * 0.5f + dir * 0.65f;
|
|||
|
|
|||
|
pr.GetComponent<SimpleProjectile>().Velocity = dir * ProjectileSpeed;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private void FixedUpdate()
|
|||
|
{
|
|||
|
if (FreezeGravity)
|
|||
|
rig.velocity = translation;
|
|||
|
else
|
|||
|
{
|
|||
|
if ( triggerJump > 0f)
|
|||
|
{
|
|||
|
rig.velocity = new Vector3(rig.velocity.x, triggerJump, rig.velocity.z);
|
|||
|
triggerJump = 0f;
|
|||
|
}
|
|||
|
|
|||
|
rig.velocity = new Vector3(translation.x, rig.velocity.y, translation.z);
|
|||
|
}
|
|||
|
|
|||
|
rig.maxAngularVelocity = 10f;
|
|||
|
|
|||
|
if (rig.velocity.sqrMagnitude > 0.05f)
|
|||
|
rig.angularVelocity = FEngineering.QToAngularVelocity(rig.rotation, tgtRotation, true);
|
|||
|
else
|
|||
|
rig.angularVelocity = Vector3.zero;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|