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 控制物体移动的一些方法相关推荐

  1. unity 控制物体移动的三种方法

    可以使按照指令物体移动的方法 一.常规方法 //四个方向if (Input.GetKey(KeyCode.W)){transform.Translate(Vector3.forward*moveSpe ...

  2. Unity实现物体生命值跟踪的方法

    需要使用Canvas,并把Canvas作为一个GameObject的子对象.之后,在Canvas上绘制需要的生命值的图形.但是,需要注意的是,必须控制Canvas,使之不能随着人物转动而转动!!! 具 ...

  3. Unity 控制物体移动

    目录 1.通过改变物体的位置使物体移动 2.通过给物体施加力使物体移动 3.移动characterController以及碰撞检测 一.相关代码展示 1.通过改变物体的位置使物体移动 using Sy ...

  4. Unity 控制物体任意轴向朝向某方向

    var rotation = transform.rotation;             var targetDir = targetPos - transform.position;       ...

  5. Unity控制物体沿x、y、z轴旋转

    普通旋转 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Rota ...

  6. Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转

    Unity中C#代码学习用wasd和上下左右键控制物体前后左右上下移动和绕轴旋转 using System.Collections; using System.Collections.Generic; ...

  7. Unity3d 控制物体transform移动的几种方法

    在Unity开发中我们难免要使用代码控制角色的移动,现将已知的几种方法总结如下: 一.transform.Translate() function Translate (translation : V ...

  8. Unity 基于法线和深度实现完美描边,可独立控制物体描边

    目录 前言 自定义PostProcess OutlineShader关键代码说明 1 使用深度绘制描边 1.1 获得斜四方形UV坐标: 1.2 采样四方向深度 2 使用法线绘制描边 3 解决倾斜表面白 ...

  9. unity实现物体移动的方法

    一.通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法. 1.使用Translate()函数. 2.,直接指定新的位置 将上述两种方法在void Update()实 ...

最新文章

  1. python字典随机取数
  2. 网站建设很简单,想要成功却很难
  3. 网页版python叫什么-python脚本和网页有何区别
  4. Report_客制化Excel报表中的XLS标记(案例)
  5. c语言随机抽奖小程序,小程序抽奖实现
  6. 设计模式--组合模式
  7. python中的def语句_Python def 函数
  8. POJ 1054 The Troublesome Frog(枚举 + 剪枝)
  9. Linux负载均衡Linux Virtual Server (lvs) 内核自带的负载均衡器
  10. Linux内核概念:per-CPU,cpumask,inicall机制,通知链
  11. NYOJ77 - 开灯问题
  12. redis bitmap存储入门
  13. UG NX10 NX12 用曲线方程式绘制实体模型的方法
  14. 新版税控注入方法及数据采集
  15. 太原理工计算机学科评估,太原理工大学学科评估结果及排名情况怎样
  16. java运维工程师简历模板_系统运维工程师个人个人简历模板.doc
  17. 史上最详细的测试用例的设计方法及案例
  18. 详细且通俗讲解轻量级神经网络——MobileNets【V1、V2、V3】
  19. pandas_计算年化收益率
  20. 响应式布局之案例--常见电商类页面效果

热门文章

  1. 必收藏的实用网站(一)
  2. 这40个冷知识,据说只有1%的人知道……颠覆你的认知!
  3. ActiveMQ应用笔记四:Ajax应用
  4. 古有穷书生街中弄笔,今有弄潮儿网上卖字
  5. 《RabbitMQ实战》7.warren和Shovel:故障转移和复制
  6. 小区数字IP广播系统
  7. 《云计算和大数据时代网络技术揭秘》读后感
  8. 7、JSON数据和Java对象的相互转换(客户端和服务器对象数据通讯用)
  9. 二进制安装Kubernetes(k8s) v1.25.0 IPv4/IPv6双栈
  10. 如何改电脑用户名WIN10/WIN11