当前位置:网站首页>Unity topdown character movement control
Unity topdown character movement control
2022-07-26 09:02:00 【m_ girlAndGirl】
The character looks in the direction of the mouse
The character keeps the world coordinates moving
Animation of character moving in eight directions
idle , Walk , running , Sprint switch
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Game
{
public class CharacterController : MonoBehaviour
{
float inputX;
float inputY;
Vector2 centerScreenPos;
[Tooltip(" The acceleration ")]
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()
{
// The character faces the mouse
Vector2 mousePos = Input.mousePosition;
Vector2 dir = mousePos - centerScreenPos;
// Calculation angle
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 Direction judgment
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 The upper right
//2
targerAngle = 45;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
// Move forward
moveX = -moveSpeed;
moveZ = moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
// back off
moveX = moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
// Move right
moveX = moveSpeed;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
// Move right forward
moveX = 0;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
// Move right back
moveX = moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY == 0)
{
// Move left
moveX = -moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
// Move left up
moveX = -moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY < 0)
{
// Move left down
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 The lower right
targerAngle = 135;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
// Move forward
moveZ = -moveSpeed;
moveX = -moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
// back off
moveZ = moveSpeed;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
// Move right
moveZ = moveSpeed;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
// Move right forward
moveZ = 0;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
// Move right back
moveZ = moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY == 0)
{
// Move left
moveZ = -moveSpeed;
moveX = moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
// Move left up
moveZ = -moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY < 0)
{
// Move left down
moveZ = 0;
moveX = moveSpeed;
}
#endregion
}
else if (angle > -157.5 && angle <= -112.5)
{
//6
#region The lower left
targerAngle = -135;
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
// Move forward
moveX = moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
// back off
moveX = -moveSpeed;
moveZ = moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
// Move right
moveX = -moveSpeed;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
// Move right forward
moveX = 0;
moveZ = -moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
// Move right back
moveX = -moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY == 0)
{
// Move left
moveX = moveSpeed;
moveZ = moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
// Move left up
moveX = moveSpeed;
moveZ = 0;
}
else if (inputX < 0 && inputY < 0)
{
// Move left down
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 Top left
if (inputX == 0 && inputY == 0)
{
//idle
moveX = 0;
moveZ = 0;
}
else if (inputX == 0 && inputY > 0)
{
// Move forward
moveZ = moveSpeed;
moveX = moveSpeed;
}
else if (inputX == 0 && inputY < 0)
{
// back off
moveZ = -moveSpeed;
moveX = -moveSpeed;
}
else if (inputX > 0 && inputY == 0)
{
// Move right
moveZ = -moveSpeed;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY > 0)
{
// Move right forward
moveZ = 0;
moveX = moveSpeed;
}
else if (inputX > 0 && inputY < 0)
{
// Move right back
moveZ = -moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY == 0)
{
// Move left
moveZ = moveSpeed;
moveX = -moveSpeed;
}
else if (inputX < 0 && inputY > 0)
{
// Move left up
moveZ = moveSpeed;
moveX = 0;
}
else if (inputX < 0 && inputY < 0)
{
// Move left down
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
// rotate
mTransfrom.eulerAngles = new Vector3(0, targerAngle, 0);
// Let the animation transition have a buffer
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;
}
}
}
Animation mix tree
边栏推荐
- Typescript encryption tool passwordencoder
- [database] gbase 8A MPP cluster v95 installation and uninstall
- ext4文件系统打开了DIR_NLINK特性后,link_count超过65000的后使用link_count=1来表示数量不可知
- Cve-2021-26295 Apache OFBiz deserialization Remote Code Execution Vulnerability recurrence
- Learn more about the difference between B-tree and b+tree
- Clean the label folder
- 数据库操作 题目一
- Horizontal comparison of the data of the top ten blue chip NFTs in the past half year
- Study notes of automatic control principle --- stability analysis of control system
- pl/sql之集合
猜你喜欢
Web overview and b/s architecture
C Entry series (31) -- operator overloading
day06 作业--技能题6
at、crontab
Database operation topic 1
Flask project learning (I) -- sayhello
李沐d2l(六)---模型选择
[search topics] flood coverage of search questions after reading the inevitable meeting
Day06 operation -- addition, deletion, modification and query
2022年上海市安全员C证考试试题及模拟考试
随机推荐
第6天总结&数据库作业
ES6模块化导入导出)(实现页面嵌套)
[eslint] Failed to load parser ‘@typescript-eslint/parser‘ declared in ‘package. json » eslint-confi
【ARKit、RealityKit】把图片转为3D模型
谷粒学院的全部学习源码
ext4文件系统打开了DIR_NLINK特性后,link_count超过65000的后使用link_count=1来表示数量不可知
2022年上海市安全员C证考试试题及模拟考试
基于序的评价指标 (特别针对推荐系统和多标签学习)
JDBC database connection pool (Druid Technology)
Review notes of Microcomputer Principles -- zoufengxing
PXE principles and concepts
【数据库 】GBase 8a MPP Cluster V95 安装和卸载
SQL入门——组合表
Day06 homework - skill question 6
2022流动式起重机司机考试题模拟考试题库模拟考试平台操作
Uploading pictures on Alibaba cloud OSS
Center an element horizontally and vertically
ext3文件系统的一个目录下,无法创建子文件夹,但可以创建文件
垂直搜索
Two tips for pycharm to open multiple projects