当前位置:网站首页>unity TopDown角色移动控制
unity TopDown角色移动控制
2022-07-26 08:52:00 【m_girlAndGirl】
角色看向鼠标方向
角色保持世界坐标移动
角色八方向移动动画
idle ,走路,跑步,冲刺切换
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Game
{
public class CharacterController : MonoBehaviour
{
float inputX;
float inputY;
Vector2 centerScreenPos;
[Tooltip("加速度")]
public float vel_Speed=10f;
Transform mTransfrom;
public float rotateSpeed = 1000;
private static int VEL_X = Animator.StringToHash("VelX");
private static int VEL_Z = Animator.StringToHash("VelZ");
Animator Animator;
public enum moveType
{
walk,
run,
sprint,
}
public moveType currentMoveType = moveType.walk;
private void Awake()
{
Animator = GetComponent<Animator>();
centerScreenPos = new Vector2(Screen.width / 2.0f, Screen.height / 2.0f);
mTransfrom = transform;
}
private void Update()
{
inputX = Input.GetAxis("Horizontal");
inputY = Input.GetAxis("Vertical");
Locomotion();
}
private void Locomotion()
{
//角色朝向鼠标
Vector2 mousePos = Input.mousePosition;
Vector2 dir = mousePos - centerScreenPos;
//计算角度
float angle = VectorAngle(dir, Vector2.up);
//Quaternion targetQua = Quaternion.LookRotation(new Vector3(dir.x, 0, dir.y));
//mTransfrom.rotation = Quaternion.RotateTowards(mTransfrom.rotation, targetQua, 1000 * Time.deltaTime);
float moveX = 0;
float moveZ = 0;
float targerAngle = 0;
float moveSpeed = 0.5f;//walk
switch (currentMoveType)
{
case moveType.walk:
break;
case moveType.run:
moveSpeed = 0.8f;
break;
case moveType.sprint:
moveSpeed = 1f;
break;
default:
break;
}
#region 方向判断
if (angle > -22.5 && angle <= 22.5)
{
//1
targerAngle = 0;
moveX = inputX == 0 ? 0 : inputX > 0 ? moveSpeed : -moveSpeed;
moveZ = inputY == 0 ? 0 : inputY > 0 ? moveSpeed : -moveSpeed;
}
else if (angle > 22.5 && angle <= 67.5)
{
#region 右上
//2
targerAngle = 45;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
//前移
moveX = -moveSpeed;
moveZ = moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
//后退
moveX = moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
//右移
moveX = moveSpeed;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
//右前移
moveX = 0;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
//右后移
moveX = moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY == 0)
{
//左移
moveX = -moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
//左上移
moveX = -moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY < 0)
{
//左下移
moveX = 0;
moveZ = -moveSpeed;
}
#endregion
}
else if (angle > 67.5 && angle <= 112.5)
{
//3
targerAngle = 90;
moveX = inputY == 0 ? 0 : inputY > 0 ? -moveSpeed : moveSpeed;
moveZ = inputX == 0 ? 0 : inputX > 0 ? moveSpeed : -moveSpeed;
}
else if (angle > 112.5 && angle <= 157.5)
{
//4
#region 右下
targerAngle = 135;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
//前移
moveZ = -moveSpeed;
moveX = -moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
//后退
moveZ = moveSpeed;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
//右移
moveZ = moveSpeed;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
//右前移
moveZ = 0;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
//右后移
moveZ = moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY == 0)
{
//左移
moveZ = -moveSpeed;
moveX = moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
//左上移
moveZ = -moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY < 0)
{
//左下移
moveZ = 0;
moveX = moveSpeed;
}
#endregion
}
else if (angle > -157.5 && angle <= -112.5)
{
//6
#region 左下
targerAngle = -135;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
//前移
moveX = moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
//后退
moveX = -moveSpeed;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
//右移
moveX = -moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
//右前移
moveX = 0;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
//右后移
moveX = -moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY == 0)
{
//左移
moveX = moveSpeed;
moveZ = moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
//左上移
moveX = moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY < 0)
{
//左下移
moveX = 0;
moveZ = moveSpeed;
}
#endregion
}
else if (angle > -112.5 && angle <= -67.5)
{
//7
targerAngle = -90;
moveZ = inputX == 0 ? 0 : inputX > 0 ? -moveSpeed : moveSpeed;
moveX = inputY == 0 ? 0 : inputY > 0 ? moveSpeed : -moveSpeed;
}
else if (angle > -67.5 && angle <= -22.5)
{
//8
targerAngle = -45;
#region 左上
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
//前移
moveZ = moveSpeed;
moveX = moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
//后退
moveZ = -moveSpeed;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
//右移
moveZ = -moveSpeed;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
//右前移
moveZ = 0;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
//右后移
moveZ = -moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY == 0)
{
//左移
moveZ = moveSpeed;
moveX = -moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
//左上移
moveZ = moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY < 0)
{
//左下移
moveZ = 0;
moveX = -moveSpeed;
}
#endregion
}
else if (angle > 157.5 || angle < 157.5)
{
//5
targerAngle = 180;
moveX = inputX == 0 ? 0 : inputX > 0 ? -moveSpeed : moveSpeed;
moveZ = inputY == 0 ? 0 : inputY > 0 ? -moveSpeed : moveSpeed;
}
#endregion
//旋转
mTransfrom.eulerAngles = new Vector3(0, targerAngle, 0);
//让动画过渡有个缓冲
float currentVel_X = Animator.GetFloat(VEL_X);
float currentVel_Z = Animator.GetFloat(VEL_Z);
float velx = Mathf.Lerp(currentVel_X,moveX,vel_Speed*Time.deltaTime);
float velz = Mathf.Lerp(currentVel_Z, moveZ, vel_Speed * Time.deltaTime);
Animator.SetFloat(VEL_X, velx);
Animator.SetFloat(VEL_Z, velz);
}
float VectorAngle(Vector2 from, Vector2 to)
{
float angle;
Vector3 cross = Vector3.Cross(from, to);
angle = Vector2.Angle(from, to);
return cross.z < 0 ? -angle : angle;
}
}
}
动画混合树
边栏推荐
- Oracle 19C OCP 1z0-082 certification examination question bank (13-18)
- (1) CTS tradefed test framework environment construction
- [freeswitch development practice] user defined module creation and use
- Okaleido launched the fusion mining mode, which is the only way for Oka to verify the current output
- Study notes of automatic control principle -- dynamic model of feedback control system
- Study notes of automatic control principle --- stability analysis of control system
- Cve-2021-3156 duplicate of sudo heap overflow privilege raising vulnerability
- Uni app simple mall production
- 2000年的教训。web3是否=第三次工业革命?
- MySQL 8.0 OCP 1z0-908 certification examination question bank 1
猜你喜欢

合工大苍穹战队视觉组培训Day6——传统视觉,图像处理

Uni app simple mall production

2000年的教训。web3是否=第三次工业革命?

海内外媒体宣发自媒体发稿要严格把握内容关

合工大苍穹战队视觉组培训Day5——机器学习,图像识别项目

03 exception handling, state keeping, request hook -- 04 large project structure and blueprint

(1) CTS tradefed test framework environment construction

Cadence (x) wiring skills and precautions

Okaleido上线聚变Mining模式,OKA通证当下产出的唯一方式

NPM add source and switch source
随机推荐
SSH,NFS,FTP
at、crontab
第6天总结&数据库作业
Which of count (*), count (primary key ID), count (field) and count (1) in MySQL is more efficient? "Suggested collection"
PXE principles and concepts
Dynamic SQL and exceptions of pl/sql
ES6 modular import and export) (realize page nesting)
Datawhale panda book has been published!
12306 ticket system crawling - 1. Saving and reading of city code data
P1825 [USACO11OPEN]Corn Maze S
Okaleido launched the fusion mining mode, which is the only way for Oka to verify the current output
Espressif 玩转 编译环境
at、crontab
Database operation topic 1
Cadence(十)走线技巧与注意事项
03 exception handling, state keeping, request hook -- 04 large project structure and blueprint
Oracle 19C OCP 1z0-082 certification examination question bank (7-12)
Study notes of automatic control principle --- stability analysis of control system
[recommended collection] summary of MySQL 30000 word essence - partitions, tables, databases and master-slave replication (V)
Kotlin属性与字段