Unity控制角色移动
Copy代码前的准备工作
整体结构

建立个空对象命名随意,主要是为了:角色掉出地图时,可以回到空对象的位置

在建立个空对象命名为Player,放到PlayResurrectionPoints子级下,并把Tag设置为Player,方便后续工作


把模型放入Player子级下,我就使用胶囊模型当作玩家

我们还需要建立个Camera当作玩家的眼睛,建立在Player下,这还没完,我们还需要把它Tag设置成PlayerCamera

哈哈,找不到是吧,因为我们的项目没有添加,我们需要自己添加,点击Add Tag…

到了这个页面,我们点击右下角的+按钮

输入PlayerCamera,输入完成后点击Save按钮,即可

这些工作都完成了,新建个脚本,自己随便命名,就可以Copy代码下面的完整代码了
完整代码
CharacterController playerController;
Vector3 direction;
[Tooltip("移动速度")]
public float Movespeed = 3f;
[Tooltip("冲刺速度")]
public float Sprintspeed = 5f;
[Tooltip("跳跃高度")]
public float jumpPower = 2.2f;
[Tooltip("重力")]
public float gravity = 7f;
[Tooltip("鼠标速度")]
public float mousespeed = 3f;
[Tooltip("最高落下不扣血")]
public float MaxFallNoDamage = 3f;
[Tooltip("限制最小角度")]
public float minmouseY = -60f;
[Tooltip("限制最大角度")]
public float maxmouseY = 65f;
GameObject PlayResurrectionPoints;
float RecordMovespeed;
float Recordgravity;
float RotationY = 0f;
float RotationX = 0f;
float RecordHeight;
Transform agretctCamera;
Vector2 m_screenpos = new Vector2();
// Use this for initialization
void Start()
{
RecordMovespeed = Movespeed;
Recordgravity = gravity;
playerController = GetComponent<CharacterController>();
agretctCamera = GameObject.FindWithTag("PlayerCamera").GetComponent<Transform>();
PlayResurrectionPoints = GameObject.Find("PlayResurrectionPoints");
//Cursor.lockState = CursorLockMode.Locked;
}
// Update is called once per frame
void FixedUpdate()
{
if(Input.touchCount == 1)
{
if(Input.touches[0].phase == TouchPhase.Began)
{
m_screenpos = Input.touches[0].position;
}
}
//GameObject.Find()
Debug.Log(m_screenpos);
float _horizontal = Input.GetAxis("Horizontal");
float _vertical = Input.GetAxis("Vertical");
if (playerController.isGrounded)
{
direction = new Vector3(_horizontal, 0, _vertical);
if (Input.GetKeyDown(KeyCode.Space))
direction.y = jumpPower;
if(RecordHeight - transform.localPosition.y > MaxFallNoDamage)
{
//这里可以写摔伤的函数
//这个是得出超出高度的值
Debug.Log((RecordHeight - transform.localPosition.y) - MaxFallNoDamage);
}
RecordHeight = 0;
}
direction.y -= gravity * Time.deltaTime;
playerController.Move(playerController.transform.TransformDirection(direction * Time.deltaTime * Movespeed));
RotationX += agretctCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * mousespeed;
RotationY -= Input.GetAxis("Mouse Y") * mousespeed;
RotationY = Mathf.Clamp(RotationY, minmouseY, maxmouseY);
this.transform.eulerAngles = new Vector3(0, RotationX, 0);
agretctCamera.transform.eulerAngles = new Vector3(RotationY, RotationX, 0);
//冲刺
if (Input.GetKey(KeyCode.W) && Input.GetKeyDown(KeyCode.LeftShift) || Input.GetKey(KeyCode.W) && Input.GetKeyDown(KeyCode.RightShift))
{
if (Movespeed != Sprintspeed)
{
Movespeed = Sprintspeed;
gravity = 12f;
}
}
if (Input.GetKey(KeyCode.LeftShift) && Input.GetKeyDown(KeyCode.W) || Input.GetKey(KeyCode.RightShift) && Input.GetKeyDown(KeyCode.W))
{
if (Movespeed != Sprintspeed)
{
Movespeed = Sprintspeed;
gravity = 12f;
}
}
if (Input.GetKeyUp(KeyCode.W) && Input.GetKey(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.W) && Input.GetKey(KeyCode.RightShift))
{
Movespeed = RecordMovespeed;
gravity = Recordgravity;
}
if (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightShift))
{
Movespeed = RecordMovespeed;
gravity = Recordgravity;
}
//如果玩家掉入深渊回到复活点
if (gameObject.transform.localPosition.y < -50)
{
gameObject.transform.position = new Vector3(PlayResurrectionPoints.transform.position.x, PlayResurrectionPoints.transform.position.y, PlayResurrectionPoints.transform.position.z);
}
//记录高度,玩家是否摔伤
if(transform.localPosition.y > RecordHeight)
{
RecordHeight = transform.localPosition.y;
}
}
最后工作
将脚本放到Player身上,在建立个Character Controller,最后就可以运行了,这些代码都是最基础的功能,我们可以继续把代码完善好

本篇技术文章完成了,如果觉得本技术文章对你有帮助请给我点个赞,如果有什么不足的地方,给我提意见,让我加以改进
Unity控制角色移动的更多相关文章
- 游戏开发之在UE4中编写C++代码控制角色
当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...
- unity3d easytouch计算摇杆旋转角度以及摇杆八方向控制角色
在写第三人称控制的时候,一开始在电脑测试是用WASD控制角色 后来需要发布到手机上,于是就加了一个摇杆 键盘控制角色的代码已经写好了,角色八方向移动 如果按照传统的大众思路来控制的话,是达不到我想要的 ...
- CocosCreator游戏开发(四)实现摇杆控制角色功能
时隔3年,我又开始继续写这个系列的帖子了,也不知道是会写完全系列,还是再次夭折. 废话不多.直接开始主题了 主要实现的功能点包含这些内容:通过摇杆控制角色进行八方位移动,并按照各方位播放对应移动动画 ...
- unity——使用角色控制器组件+射线移动
首先要导入unity标准资源包Character Controllers 这个标准资源包,为了方便,还添加了两外一个资源包Scripts,后者包含了一些基本的脚本个摄像机脚本. 没错,这次我们要使用其 ...
- Unity5.5+easytouch5双摇杆控制角色移动
第一步:新建两个Joystick,分别改名LeftJoyStick和RightJoyStick 在LeftJoyStick的ETC Joystick-Axes properties中的Horizont ...
- (转)Unity控制反转和依赖注入
昨天,面试官说他们的项目使用的是Unity,我们的项目中使用的是autofac,看了一下,用法都差不多,就连方法的名字都是一样的哈,想了解的朋友可以看看这篇文章,作者讲解的挺详细的,关于autofac ...
- 【Unity】角色受伤后的闪烁(blink/flash)效果
玩家受伤后,一段时间内快速闪烁.这里想要的闪烁效果是玩家快速的显隐切换效果,而不是玩家变白的情况. 快速切换玩家的显隐效果不能用SetActive修改角色物体本身的激活状态,因为玩家角色身上的其他脚本 ...
- 【Unity】角色沿路线移动/朝着目标移动
先在场景中放置一连串物体作为角色移动路线的关键点,可以把关键点的触发器Trigger拉得大一些方便角色接触到(如酷跑/赛车类项目可以把关键点的触发器做成拦截整个道路的墙面形状).让角色从开始位置朝着第 ...
- Unity 控制public/private 是否暴露给Inspector面板
默认情况下Public是暴露给Unity,protect/private是不暴露给Unity的,但有时候想让外部引用,又不想暴露给Unity,怎么办? 对Unity隐藏,使用[HideInInspec ...
随机推荐
- 如何使用 TDengine 2.0 最新开源的集群功能?
导读:8月3日,TDengine 发布了 v2.0 版本,这次更新最大的亮点是,我们将分布式集群功能开源.开源后,引起了很大反响,又连续几天在 GitHub 趋势榜排名第一.不少关注TDengine的 ...
- 突然挂了!Redis缓存都在内存中,这下完了!
我是Redis,一个叫Antirez的男人把我带到了这个世界上. “快醒醒!快醒醒!”,隐隐约约,我听到有人在叫我. 慢慢睁开眼睛,原来旁边是MySQL大哥. “我怎么睡着了?” “嗨,你刚才是不是出 ...
- Linux实战(13):Centos8安装FFmpeg
此文章所做的操作参考漏网的鱼:参考链接 步骤1:安装RPMfusion Yum存储库 RHEL或兼容发行版(如CentOS)上启用EPEL. dnf -y install https://downlo ...
- Vue入门到精通
Vue.js - Day1 课程介绍 前5天: 都在学习Vue基本的语法和概念:打包工具 Webpack , Gulp 后5天: 以项目驱动教学: 什么是Vue.js Vue.js 是目前最火的一个前 ...
- 性能之qps,并发数,相应时间
QPS:每秒处理的请求数.QPS = 并发数/请求平均处理时间. 请求响应时间=请求等待时间+网络时间+请求处理时间.假设请求处理时间不受影响,持续不变,实际请求数大于QPS,会影响请求响应时间,大量 ...
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?
这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为 ...
- python-面向过程面向对象和栈的实现
0x01 大纲 面向过程 函数 参数传递 返回 面向对象 类 栈的数据结构实现 0x02 例子 def add(a,b): return a+b if __name__ == '__main__': ...
- Redis5设计与源码分析读后感(三)跳跃表
一.引言 有序集合在日常开发中相当常见,比如做排名等相关的功能,肯定要用到排序的功能,那么常见底层实现有很多种: 数组 :不便于元素的插入和删除 链表 :查询效率低,需要遍历所有元素 平衡树OR红黑树 ...
- zabbix关键字含义
Zabbix server :zabbix控制中心,收集数据,写入数据库都是他的工作 Zabbix Agent:部署在被监控服务器上的一个进程,负责和zabbix server 交互,执行命令. Ho ...
- python3-day3
一.函数基本语法及特性 重复用到的代码通过def封装起来,用到的时候直接调用函数名字:语法 1 def 函数名字(内容): 2 需要执行的动作 什么是函数: 函数一词来源于数学,但编程中的「函数」概念 ...