Unity 控制物体移动的一些方法
Unity 控制物体移动的一些方法
开坑, 回头慢慢补.
移动方法的总结.
1, 直接+=Vector3
transform.position += Vector3.forward * moveSpeed * Time.deltaTime;
简单直接, 向前方, 匀速运动.
说白了, Vector3.forward就是Vector3(0, 0, 1), 是z轴, 即3d游戏世界里的"前".
Vector3.up和down是(0,1,0)和(0,-1,0), 是Y轴, 即"上下".
Vector3.left和right是(-1,0,0)和(1,0,0), 是X轴, 即"左右".
另外还有Vecto3.zero是(0,0,0), Vecto3.one是(1,1,1).
需要注意的是Vector3.forward代表的"前"是世界坐标的"前", 并不是游戏中人物局部坐标的"前".
↓下面这样才是人物的"前":
transform.position += transform.forward * moveSpeed * Time.deltaTime;
那假如我想朝A物体的方向走, 怎么办呢?
//先得到一个从"我"指向"A"的向量
Vector3 direction = A.transform.position - transform.position;
//朝着向量走
transform.position += direction.normalized * moveSpeed * Time.deltaTime;
2, Vector3. MoveTowards( )
transform.position = Vector3.MoveTowards(startPoint.position, stopPoint.position, moveSpeed * Time.deltaTime);
Vector3.MoveTowards(起点, 终点, 速度);
厉害在于, 可以设置起点, 终点.
3, transform. Translate( )
//向世界坐标的"前"方移动
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime, Space.World);
//或者写成这样//向我的"前"方移动
transform.Translate(new Vector3(0, 0, 1) * moveSpeed * Time.deltaTime);
//还有这样
float h = Input.GetAxis("Horizontal");//X轴控制左右移动
float v = Input.GetAxis("Vertical");//Z轴控制前后移动
transform.Translate(new Vector3(h, 0, v) * moveSpeed * Time.deltaTime);
Input.GetAxis()是一个从-1到1的值, 当你按下WASD或者↑↓←→, 就会从0渐变到1或-1, 感觉有一个起步速度.
用Input.GetAxisRow() , 没有渐变, 只有 -1, 0, 1这3个固定的值.
Space如果没有设置, 就默认为Space.Self, 即, 按照本地坐标系移动.
Space.World, 按照世界坐标系移动.
也可以设置一个 xxx.transform, 按它的坐标系移动.
(Unity里的各种坐标很坑)
4, Vector3. Lerp( )
//第一种方法
transform.position = Vector3.Lerp(transform.position, end.position, moveSpeed);
//第二种方法
transform.position = Vector3.Lerp(start.position, end.position, Time.deltaTime);
3个参数: 起点, 终点, 插值.
插值是一个0到1的数, 如果是0, 返回start.position, 如果是1, 返回end.position, 如果是0.1, 返回两者之间10%的位置点. 然后transform.position=这个点.
想要移动有2种方法:
1, 改变start的坐标点
2, 改变moveSpeed
像是被猛地推了一下, 然后在摩擦力的作用下减速.
Lerp你一定要学, 使运动看起来比较平滑
5, 使用DOTween插件
//花费0.5秒, 移动到111
transform.doMove(Vector3.one, 0.5f);
更多DOTween的使用↓
https://blog.csdn.net/weixin_43994445/article/details/98649085
以下3个适用于刚体RigidBody, 我用小球测试的
6, MovePosition( )
Rigidbody rig = GetComponent<Rigidbody>();
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rig.MovePosition(transform.position+ new Vector3(h, 0, v).normalized * moveSpeed*Time.deltaTime);
给Position, 让刚体瞬间移到Position的位置, 不受惯性 ,不能上坡(因为y轴定死了等于0)
7, Volecity
Rigidbody rig = GetComponent<Rigidbody>();
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rig.velocity = new Vector3(h,0,v).normalized *moveSpeed;
给一个速度, 立即改变物体的速度, 如果什么都不输入即h和v都是0, 物体立马就停了, 不受惯性, 能上坡
8, AddForce( )
Rigidbody rig = GetComponent<Rigidbody>();
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rig.AddForce(new Vector3(h, 0, v).normalized *moveSpeed*10);
相当真实的模拟物理作用, 给一个力, 就像推一下, 会有惯性, 持续给力速度会越来越快, 能上坡(速度不够的话冲上不去)
以上3个适用于刚体. 实际做游戏中, 能不用刚体就尽量不用, 尽可能的自己写代码模拟物理效果. 用上了刚体就会在碰撞中受到各种奇怪的力, 比如吃鸡里的车会螺旋飞天.
9, transform.Rotate ( )
transform.rotate(Vector3.up, Space.Self);
地球自转, 也可以Space.World, 见第3条
10, transform.RotateAround( )
transform.rotateAround(Sun.position, Vector3.up, turnSpeed * Time.deltaTime);
绕太阳公转
11, 计算距离
float dis = Vector3.Distance(start.position, stop.position);
//或者
float dis = (start.position- stop.position).magnitude;
可以用距离<0.1f来让它停止移动
float dis = Vector3.Distance(transform.position, stop.position);
if(dis < 0.1f)
{transform.position += stop.position.normalized * moveSpeed * Time.deltaTime;
}
Vector3.normalized;返回这个向量的单位向量, 原向量的值不变;
Vector3.Normalized();这个方法把这个向量转化为单位向量, 会改变原向量的值;
Unity 控制物体移动的一些方法相关推荐
- unity 控制物体移动的三种方法
可以使按照指令物体移动的方法 一.常规方法 //四个方向if (Input.GetKey(KeyCode.W)){transform.Translate(Vector3.forward*moveSpe ...
- Unity实现物体生命值跟踪的方法
需要使用Canvas,并把Canvas作为一个GameObject的子对象.之后,在Canvas上绘制需要的生命值的图形.但是,需要注意的是,必须控制Canvas,使之不能随着人物转动而转动!!! 具 ...
- Unity 控制物体移动
目录 1.通过改变物体的位置使物体移动 2.通过给物体施加力使物体移动 3.移动characterController以及碰撞检测 一.相关代码展示 1.通过改变物体的位置使物体移动 using Sy ...
- Unity 控制物体任意轴向朝向某方向
var rotation = transform.rotation; var targetDir = targetPos - transform.position; ...
- Unity控制物体沿x、y、z轴旋转
普通旋转 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Rota ...
- Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转
Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转 using System.Collections; using System.Collections.Generic; ...
- Unity3d 控制物体transform移动的几种方法
在Unity开发中我们难免要使用代码控制角色的移动,现将已知的几种方法总结如下: 一.transform.Translate() function Translate (translation : V ...
- Unity 基于法线和深度实现完美描边,可独立控制物体描边
目录 前言 自定义PostProcess OutlineShader关键代码说明 1 使用深度绘制描边 1.1 获得斜四方形UV坐标: 1.2 采样四方向深度 2 使用法线绘制描边 3 解决倾斜表面白 ...
- unity实现物体移动的方法
一.通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法. 1.使用Translate()函数. 2.,直接指定新的位置 将上述两种方法在void Update()实 ...
最新文章
- python字典随机取数
- 网站建设很简单,想要成功却很难
- 网页版python叫什么-python脚本和网页有何区别
- Report_客制化Excel报表中的XLS标记(案例)
- c语言随机抽奖小程序,小程序抽奖实现
- 设计模式--组合模式
- python中的def语句_Python def 函数
- POJ 1054 The Troublesome Frog(枚举 + 剪枝)
- Linux负载均衡Linux Virtual Server (lvs) 内核自带的负载均衡器
- Linux内核概念:per-CPU,cpumask,inicall机制,通知链
- NYOJ77 - 开灯问题
- redis bitmap存储入门
- UG NX10 NX12 用曲线方程式绘制实体模型的方法
- 新版税控注入方法及数据采集
- 太原理工计算机学科评估,太原理工大学学科评估结果及排名情况怎样
- java运维工程师简历模板_系统运维工程师个人个人简历模板.doc
- 史上最详细的测试用例的设计方法及案例
- 详细且通俗讲解轻量级神经网络——MobileNets【V1、V2、V3】
- pandas_计算年化收益率
- 响应式布局之案例--常见电商类页面效果