Unity3D控制人物移动的多种方法
系列文章目录
unity知识点
文章目录
- 系列文章目录
- 前言
- 一、人物移动之键盘移动
- 1-1、代码如下
- 1-2、效果
- 二、人物移动之跟随鼠标点击移动
- 2-1、代码如下
- 2-2、效果
- 三、人物移动之刚体移动
- 3-1、代码如下
- 3-2、效果
- 四、人物移动之第一人称控制器移动
- 4-1、代码如下
- 4-2、效果
- 五、Android触摸手势操作脚本(单指 双指 三指)
- 5-1、代码如下
- 总结
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
前言
人物移动代码综合记录一下(因为有很多种).所以简单记录一下
一、人物移动之键盘移动
所谓键盘移动就是我们常玩游戏的操作 wasd来进行移动
1-1、代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerToKeyPad : MonoBehaviour
{public GameObject Player;public float m_speed = 5f;void Update(){//键盘控制移动 两种方法PlayerMove_KeyPad_1();PlayerMove_KeyPad_2();}//通过Transform组件 键盘控制移动public void PlayerMove_KeyPad_1(){if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前{Player.transform.Translate(Vector3.forward * m_speed * Time.deltaTime);}if (Input.GetKey(KeyCode.S) | Input.GetKey(KeyCode.DownArrow)) //后{Player.transform.Translate(Vector3.forward * -m_speed * Time.deltaTime);}if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.LeftArrow)) //左{Player.transform.Translate(Vector3.right * -m_speed * Time.deltaTime);}if (Input.GetKey(KeyCode.D) | Input.GetKey(KeyCode.RightArrow)) //右{Player.transform.Translate(Vector3.right * m_speed * Time.deltaTime);}}public void PlayerMove_KeyPad_2(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下Player.transform.Translate(Vector3.forward * vertical * m_speed * Time.deltaTime);//W S 上 下Player.transform.Translate(Vector3.right * horizontal * m_speed * Time.deltaTime);//A D 左右}
}
1-2、效果
人物移动之键盘控制效果
二、人物移动之跟随鼠标点击移动
2-1、代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerToMouse : MonoBehaviour
{public GameObject Player;Vector3 tempPoint = new Vector3(0, 0, 0);void Update(){PlayerMove_FollowMouse();}//角色移动到鼠标点击的位置public void PlayerMove_FollowMouse(){//右键点击if (Input.GetMouseButtonDown(1)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo)){tempPoint = new Vector3 ( hitInfo.point.x, hitInfo.point.y+0.5f, hitInfo.point.z);}}float step = 10 * Time.deltaTime;Player.transform.localPosition = Vector3.MoveTowards(Player.transform.localPosition, tempPoint, step);Player.transform.LookAt(tempPoint);}
}
2-2、效果
人物移动之跟随鼠标点击移动
三、人物移动之刚体移动
里面包含两个方法一个是:Velocity移动 一个是:AddForce移动
3-1、代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerToRigidbody : MonoBehaviour
{public GameObject Player;public float m_speed = 5f;void Update(){//PlayerMove_KeyRighidbody1();PlayerMove_KeyRighidbody2();}//通过Rigidbody组件 键盘控制移动 Velocity移动 角色身上需要挂载Rigidbody组件public void PlayerMove_KeyRighidbody1(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下//这个必须分开判断 因为一个物体的速度只有一个if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.S)){Player.GetComponent<Rigidbody>().velocity = Vector3.forward * vertical * m_speed;}if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.D)){Player.GetComponent<Rigidbody>().velocity = Vector3.right * horizontal * m_speed;}}//通过Rigidbody组件 键盘控制移动 AddForce移动 角色身上需要挂载Rigidbody组件public void PlayerMove_KeyRighidbody2(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下Player.GetComponent<Rigidbody>().AddForce(Vector3.forward * vertical * m_speed);Player.GetComponent<Rigidbody>().AddForce(Vector3.right * horizontal * m_speed);}}
3-2、效果
人物移动之刚体移动
人物移动之刚体添加力移动
四、人物移动之第一人称控制器移动
里面包含两个方法一个是:SimpleMove控制移动 一个是:Move控制移动
4-1、代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerToCharacterController : MonoBehaviour
{public GameObject Player;public float m_speed = 5f;void Update(){//PlayerMove_KeyCharacterController1();PlayerMove_KeyCharacterController2();}//通过CharacterController组件 键盘移动物体 SimpleMove控制移动public void PlayerMove_KeyCharacterController1(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下if (horizontal !=0&&vertical ==0){Player.GetComponent<CharacterController>().SimpleMove(transform.right * horizontal * m_speed);}else if (horizontal == 0 && vertical != 0){Player.GetComponent<CharacterController>().SimpleMove(transform.forward * vertical * m_speed);}else{//斜着走 例如w a一起按Player.GetComponent<CharacterController>().SimpleMove(transform.forward * vertical * m_speed);Player.GetComponent<CharacterController>().SimpleMove(transform.right * horizontal * m_speed);}}//通过CharacterController组件 键盘移动物体 Move控制移动public void PlayerMove_KeyCharacterController2(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下float moveY = 0;float m_gravity = 10f;moveY -= m_gravity * Time.deltaTime;//重力Player.GetComponent<CharacterController>().Move(new Vector3(horizontal, moveY, vertical) * m_speed * Time.deltaTime);}}
4-2、效果
人物移动之第一人称控制器移动
五、Android触摸手势操作脚本(单指 双指 三指)
相机设置如下
单指移动,双指缩放 , 三指旋转
移动和旋转动的是Pivot 缩放动的是Main Camera的Z轴距离
5-1、代码如下
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class TouchMove : MonoBehaviour
{public Camera cameraMainTrans;public Transform rotTransform;private float zoomSpeed = 0.1f;private float rotateSpeed = 0.5f;private float moveSpeed = 0.1f;private Vector2 prevPos1, prevPos2,prevPos3;private float prevDistance;void Update(){// 处理单指触摸平移if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved){Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;float tranY = touchDeltaPosition.y * (float)Math.Sin(Math.Round(this.transform.localRotation.eulerAngles.x, 2) * Math.PI / 180.0);float tranZ = touchDeltaPosition.y * (float)Math.Cos(Math.Round(this.transform.localRotation.eulerAngles.x, 2) * Math.PI / 180.0);rotTransform.Translate(new Vector3(touchDeltaPosition.x, tranY, tranZ) * moveSpeed, Space.Self);Debug.Log(touchDeltaPosition.x + "单指横向+纵向+" + touchDeltaPosition.y);}// 处理双指触摸缩放if (Input.touchCount == 2){Touch touch1 = Input.GetTouch(0);Touch touch2 = Input.GetTouch(1);// 获取距离和位置的差异Vector2 curPos1 = touch1.position;Vector2 curPos2 = touch2.position;float curDistance = Vector2.Distance(curPos1, curPos2);if (touch2.phase == TouchPhase.Began){prevPos1 = curPos1;prevPos2 = curPos2;prevDistance = curDistance;}// 缩放摄像机float deltaDistance = curDistance - prevDistance;cameraMainTrans.transform.Translate(Vector3.back * -deltaDistance * 0.1f);// 更新变量prevPos1 = curPos1;prevPos2 = curPos2;prevDistance = curDistance;}// 处理三指触摸旋转if (Input.touchCount == 3){Touch touch1 = Input.GetTouch(0);Touch touch2 = Input.GetTouch(1);Touch touch3 = Input.GetTouch(2);// 获取触摸位置的差异Vector2 curPos1 = touch1.position;Vector2 curPos2 = touch2.position;Vector2 curPos3 = touch3.position;Vector2 deltaPos1 = curPos1 - prevPos1;Vector2 deltaPos2 = curPos2 - prevPos2;Vector2 deltaPos3 = curPos3 - prevPos3;if (touch2.phase == TouchPhase.Moved){// 计算横向旋转float horizontalRotation = deltaPos1.x * rotateSpeed;rotTransform.Rotate(Vector3.up, horizontalRotation);// 计算纵向旋转float verticalRotation = -deltaPos1.y * rotateSpeed;Vector3 verticalRotationAxis = rotTransform.TransformVector(Vector3.left);rotTransform.RotateAround(rotTransform.position, verticalRotationAxis, verticalRotation);}// 更新变量prevPos1 = curPos1;prevPos2 = curPos2;prevPos3 = curPos3;}else if (Input.touchCount == 0){// 清除前一帧的触摸位置prevPos1 = Vector2.zero;prevPos2 = Vector2.zero;prevPos3 = Vector2.zero;}}private static float ClampAngle(float angle, float min, float max){if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp(angle, min, max);}
}
总结
不定时更新Unity开发技巧,觉得有用记得一键三连哦。
防止后面忘记,所以记录一下
相关文章:

Unity3D控制人物移动的多种方法
系列文章目录 unity知识点 文章目录 系列文章目录前言一、人物移动之键盘移动1-1、代码如下1-2、效果 二、人物移动之跟随鼠标点击移动2-1、代码如下2-2、效果 三、人物移动之刚体移动3-1、代码如下3-2、效果 四、人物移动之第一人称控制器移动4-1、代码如下4-2、效果 五、And…...

无人机打击激光器
激光器的应用非常广泛,涵盖了多个领域。以下是一些主要的激光器应用: 医疗领域:激光器在医疗行业中有着重要应用,比如用于激光手术(如眼科手术)、皮肤治疗、牙科治疗、肿瘤治疗等。 工业制造:在…...

Lingo数学建模基础
1.基本运算符 1.1算数运算符 1.2逻辑运算 #not# 否定操作数的逻辑值,一元运算符 #eq# 若两运算数相等,则为true,否则为false #ne# 若两运算数不相等,则为true,否则为false #gt# 若左边运算数严格大于右边,则为true,否则为…...

finalshell连接linux的kali系统
kali的ssh服务似乎是默认关闭的,笔者在玩CentOS系统时可以直接用finalshell完成连接,但kali不行,需要先手动开启ssh服务。 开启kali的ssh服务 输入【ssh start】命令开启ssh服务,可以用【ssh status】命令查看ssh状态,…...

2、Line Charts折线图
可视化时间趋势 现在你已经熟悉了编码环境,是时候学习如何制作自己的图表了! 在本教程中,您将学习足够的Python来创建专业外观的折线图。然后,在接下来的练习中,您将使用您的最新技能处理真实世界的数据集。 本课程数据集夸克网盘下载链接:https://pan.quark.cn/s/a235ac…...
shell脚本获得所有数据库备份(整库备份,表级备份)
数据库备份到天翼云对象存储OBS https://blog.csdn.net/qq_34631220/article/details/135755894 1、获得所有数据库 #!/bin/sh HOSTNAME"ip" #数据库信息 PORT"3306" USERNAME"root" PASSWORD"" DBNAME"yusuan" #数据库…...

REVIT二次开发万能刷
将这两个参数赋予其他参数 步骤2 将来做个可以调控的版本 using System; using System.Collections.Generic; using System.Lin...

JSON简单了解
文章目录 1、JSON介绍2、ES6模版字符串3、JS对象转化为JSON字符串3.1、手动JS对象转化为JSON字符串3.2、自动JS对象转化为JSON字符串 4、JS对象和java互相转换 1、JSON介绍 JSON 概念:JavaScript Object Notation。JavaScript 对象表示法,简单理解JSON是…...

HarmonyOS鸿蒙应用开发( 四、重磅组件List列表组件使用详解)
List列表组件,是一个非常常用的组件。可以说在一个应用中,它的身影无处不在。它包含一系列相同宽度的列表项,适合连续、多行呈现同类数据,如商品列表、图片列表和和文本列表等。ArkUI 框架采用 List 容器组件创建列表(…...

redis优化系列(六)
本期分享redis内存过期策略:过期key的处理 Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存: maxmemory 1gb …...

【 Qt 快速上手】-②- Qt 环境搭建
文章目录 1. Qt 开发工具概述1.1 Qt Creator 介绍1.2 Visual Studio 介绍1.3 Eclipse 介绍 2. Qt SDK 的下载与安装2.1 Qt SDK 的下载2.2 Qt SDK 的安装2.3 验证 Qt SDK 安装是否成功2.4 Qt 环境变量配置 1. Qt 开发工具概述 Qt 开发环境需要安装三个部分: C编译器…...
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。 以下是几个面试技巧: 1. 复习核心概念:回顾 Ja…...
视觉空间效应
一、视觉空间效应 概况 视觉空间效应,是人类视觉系统(Human Visual System,HVS)的一个特点,也称为"视觉距离效应"。即距离观察者更近的目标像素对颜色感知产生更强烈的影响,而距离较远的目标像素…...

C#,入门教程(07)——软件项目的源文件与目录结构
上一篇: C#,入门教程(06)——解决方案资源管理器,代码文件与文件夹的管理工具https://blog.csdn.net/beijinghorn/article/details/124895033 创建新的 C# 项目后, Visual Studio 会自动创建一系列的目录与文件。 程序员后面的工…...
三国游戏(第十四届蓝桥杯)
题目 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z(一开始可以认为都为 0)。 游戏有 n个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i个事件发生时会分别让 X,Y,Z 增加 A i , B…...

k8s---包管理器helm
内容预知 目录 内容预知 helm相关知识 Helm的简介与了解 helm的三个重要概念 helm的安装和使用 将软件包拖入master01上 使用 helm 安装 Chart 对chart的基本使用 查看chart信息 安装chart 对chart的基本管理 helm自定义模板 在镜像仓库中拉取chart,查…...

对于超低延迟SSD,IO调度器已经过时了吗?-part2
为了进行这项研究,他们设计了一套严谨的实验方法论,包括在配备了高速Intel Optane P4801X Series NVMe SSD的服务器上执行一系列微观和宏观基准测试,同时监测系统能耗情况。这些测试涵盖了多种工作负载场景,从单一进程提交大量请求…...

【C++】list的使用
目录 1 构造1.1 无参构造1.2 构造的list中包含n个值为val的元素1.3 用[first, last)区间中的元素构造list1.4 拷贝构造 2 迭代器的使用2.1 begin end2.2 rbegin rend 3 容量操作3.1 empty size 4 获取元素4.1 front back 5 插入、删除、修改5.1 头插-push_front和尾插-push…...

mybatis的缓存机制
视频教程_免费高速下载|百度网盘-分享无限制 (baidu.com) MyBatis 有一套灵活而强大的缓存机制,主要分为两级缓存:一级缓存(本地缓存)和二级缓存(全局缓存)。 一级缓存(本地缓存)&a…...

ChatGLM3报错:No chat template is defined for this tokenizer
使用官方提供的脚本创建ChatGLM3的DEMO: cd basic_demo python web_demo_gradio.py 出现效果异常问题: conversation [{role: user, content: 你好}, {role: assistant, content: 你好,有什么我可以帮助你的吗?\n\n<|im_end|…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...