DSPlayerCtrl.cs
using System.Collections;
using System.Collections.Generic;
using DSFramework;
using UnityEngine;
public class DSPlayerCtrl : DSMonoBehaviour
{
public GameObject model;
//private Animator ani;
private DSPlayerInput pi;
private Rigidbody DS_Rigidbody_rigid;
[SerializeField] private float DS_float_moveSpeed = 10f;
/// <summary>
/// 移动向量
/// </summary>
private Vector3 movingVec;
private void Awake()
{
//ani = model.GetComponent<Animator>();
pi = GetComponent<DSPlayerInput>();
DS_Rigidbody_rigid = DSGetCmpt<Rigidbody>();
DSEntity.Mono.DSAddUpdateListener(OnUpdate);
DSEntity.Mono.DSAddFixedUpdateListener(OnFixedUpdate);
}
private void OnUpdate()
{
//ani.SetFloat("forward", pi.Dmag);
if (pi.Dmag > 0.1f)
{
model.transform.forward = Vector3.Slerp(model.transform.forward, pi.Dvec, 0.3f); //缓慢转向目标
}
DS_float_moveSpeed = pi.run ? 10f : 5f;
movingVec = pi.Dmag * model.Forward() * DS_float_moveSpeed;
}
private void OnFixedUpdate()
{
// DS_Rigidbody_rigid.position += movingVec * Time.fixedDeltaTime;
DS_Rigidbody_rigid.velocity = new Vector3(movingVec.x, DS_Rigidbody_rigid.velocity.y, movingVec.z);
}
}
DSPlayerInput.cs
using System;
using System.Collections;
using System.Collections.Generic;
using DSFramework;
using UnityEngine;
public class DSPlayerInput : DSMonoBehaviour
{
public KeyCode keyUp = KeyCode.W;
public KeyCode keyDown = KeyCode.S;
public KeyCode keyLeft = KeyCode.A;
public KeyCode keyRight = KeyCode.D;
public KeyCode keyA = KeyCode.LeftShift;
public KeyCode keyB = KeyCode.None;
public KeyCode keyC = KeyCode.None;
public KeyCode keyD = KeyCode.None;
#region 设置方向
/// <summary>
/// 向上还是向下,1=上,0=下
/// </summary>
public float Dup;
private float Dup2;
/// <summary>
/// 向还是向右,0=左,1=右
/// </summary>
public float Dright;
private float Dright2;
private Vector2 tempAxis;
/// <summary>
/// 输入开关
/// </summary>
public bool inputEnable = true;
/// <summary>
/// 角色动画
/// </summary>
[HideInInspector] public float Dmag;
/// <summary>
/// 角色方向
/// </summary>
[HideInInspector] public Vector3 Dvec;
//目标方向
private float targetDup;
private float targetDright;
//转动速度
private float DupVelocity;
private float DrightVelocity;
public bool run = false;
#endregion
private void Start()
{
DSEntity.Mono.DSAddUpdateListener(OnUpdate);
}
private void OnUpdate()
{
//设置方向
targetDup = ((Input.GetKey(keyUp) ? 1.0f : 0f) - (Input.GetKey(keyDown) ? 1.0f : 0f));
targetDright = ((Input.GetKey(keyRight) ? 1.0f : 0f) - (Input.GetKey(keyLeft) ? 1.0f : 0f));
if (inputEnable == false) return;
Dup = Mathf.SmoothDamp(Dup, targetDup, ref DupVelocity, 0.1f);
Dright = Mathf.SmoothDamp(Dright, targetDright, ref DrightVelocity, 0.1f);
tempAxis = SquareToCircle(new Vector2(Dup, Dright));
Dup2 = tempAxis.x;
Dright2 = tempAxis.y;
Dmag = Mathf.Sqrt(Dup2 * Dup2 + Dright2 * Dright2);
Dvec = Dright2 * transform.right + Dup2 * transform.forward;
run = Input.GetKey(keyA);
}
/// <summary>
/// 正方形转为椭圆
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private Vector2 SquareToCircle(Vector2 input)
{
Vector2 output = Vector2.zero;
output.x = input.x * Mathf.Sqrt(1 - (input.y * input.y) / 2.0f);
output.y = input.y * Mathf.Sqrt(1 - (input.x * input.x) / 2.0f);
return output;
}
}