Unity移动方法总结

在Unity3D中,有多重方式可以改变物体的坐标,实现移动的目的,其本质是每帧改变物体的position。

  1. 通过Transform组件移动物体
    Transform组件用于描述物体在空间中的状态,它包括位置(position),旋转(rotation)和缩放(scale)。
    其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。
    API:
//物体以relativeTo为参照系,根据translation的向量移动。如果relativeTo缺省将以Space.Self为默认值,还可以设置为Space.World和gameObject.transform。
function Translate (translation : Vector3, relativeTo : Space = Space.Self) : void
//相对坐标系空间:当relativeTo设置为空或者为Space.Self,表示该物体沿着自己本地坐标进行运动。当设置为Space.World,表示该物体沿着世界坐标系进行运动。
//相对其他物体坐标:当relativeTo设置为移动参考物体的gameObject.transform时,物体根据gameObject的坐标系进行相对运动。设置为Camera.main.transform时,相对主相机进行运动。//两种形式
public void Translate(Vector3 translation, Space relativeTo = Space.Self);
public void Translate(float x, float y, float z, Space relativeTo = Space.Self);

示例:

function Update() {//导弹相对于战斗机Fighter以Speed的速度向前运动,Vector3.forward在此时表示导弹的正前方transform.Translate(Vector3.forward * Speed * Time.deltaTime, Fighter.transform);}if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) //上移
{transform.Translate(Vector3.up * speed * Time.deltaTime);}
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) //下移
{transform.Translate(Vector3.down * speed * Time.deltaTime);}
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) //左移
{transform.Translate(Vector3.left * speed * Time.deltaTime);}
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) //右移
{transform.Translate(Vector3.right * speed * Time.deltaTime);}//使用上下方向键或者W、S键来控制前后移动
float translation = Input.GetAxis("Vertical") * speed * Time.deltaTime;
//使用左右方向键或者A、D键来控制左右旋转
float rotation = Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;
  1. 通过Rigidbody组件移动物体
    Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响、物体被碰撞后的击飞和通过增加物体的受力以达到物理效果等等。
    注意,关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

(1)Rigidbody.velocity
设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

void Start () {gameObject.GetComponent<Rigidbody>().velocity = Vector3.forward * MoveSpeed;}

(2)Rigidbody.AddForce/AddForcePosition
给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。

//第一个例子
void Start(){rd = this.GetComponent<Rigidbody>();//给变量赋值刚体对象}
void FixedUpdate() {float h = Input.GetAxis("Horizontal"); //得到键盘左右控制float v = Input.GetAxis("Vertical"); //得到键盘上下控制rd.AddForce(new Vector3(h,0,v)*force);//对物体施加力 }//另一个例子
void Update(){if(Input.GetMouseButton(0)){Ray ray =  Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if(Physics.Raycast(ray, out hit)){if(hit.collider.name =="Cube"){Vector3 direction = hit.transform.position - obj.transform.position;//发射炮弹obj.GetComponent<Rigidbody>().AddForceAtPosition(direction, hit.transform.position,ForceMode.Impulse); //三个参数,分别为力、位置、力的方式}   }}
}

(3)Rigidbody.MovePosition
刚体受到物理约束的情况下,移动到指定点position。

void FixedUpdate() {//让刚体rb向前运动Time.deltaTime距离rb.MovePosition(transform.position + transform.forward * Time.deltaTime);}
  1. 通过Vector3方法移动物体
    Vector3既可以表示三维空间中的一个点,也可以表示一个向量。
    Lerp为线性插值,Slerp为球形插值,MoveTowards在Lerp的基础上增加了限制最大速度功能。当需要从指定A点移动到B点时,可以考虑时候这些方法。

(1)Vector3.Lerp()
API:

static function Lerp(transform.position, target, MoveSpeed * Time.deltaTime) : Vector3;

示例:

void Start () {public float MoveSpeed = 0.1f;public Vector3 target = new Vector3(20, transform.position.y, 20);}void Update () {gameObject.transform.localPosition = Vector3.Lerp(transform.position, Target, MoveSpeed * Time.deltaTime);}

(2)Vector3.MoveTowards()
MoveTowards增加了限制最大速度功能。
API:

static function MoveTowards(current: Vector3, target: Vector3, maxDistanceDelta: float) : Vector3;

示例:

void Start () {public float MoveSpeed = 0.1f;public Vector3 target = new Vector3(20, transform.position.y, 20);}void Update () {gameobject.transform.position = Vector3.MoveTowards(transform.position, target, MoveSpeed * Time.deltaTime);}

(3)Vector3.SmoothDamp()
该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。
API:

//在smoothTime的时间间隔内以当前的移动速度currentVelocity,从current移动到target
//需要注意的是currentVelocity值一般在开始时指定为零向量,每次调用该方法时该方法会自动给currentVelocity赋值
static function SmoothDamp (current : Vector3, target : Vector3, ref currentVelocity : Vector3, smoothTime : float) : Vector3

示例:

void Start () {public Transform target;public float smoothTime = 0.3F;private Vector3 velocity = Vector3.zero;}void Update () {//定义一个目标位置在目标变换的上方并且在后面Vector3 targetPosition = target.TransformPoint(new Vector3(0, 5, -10));//平滑地移动摄像机朝向目标位置gameobject.transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);}
  1. 使用CharacterController组件控制角色移动
    Unity使用CharacterController(角色控制器)来控制角色骨骼运动,包括移动、跳跃以及各种动作。CharacterController比较复杂。
    CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

CharacterController.SimpleMove:
用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。

CharacterController.Move:
模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。

Unity 移动方法总结相关推荐

  1. C#开发Unity游戏教程之Unity中方法的参数

    C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号"( )",有意义吗?看起来最 ...

  2. Unity下载方法(超详细)

    一.进入官网,点击[下载Unity],点击右上角的小人头像,点击[创建Unity ID](创建ID的方法你点进去按照它要求你的一步一步做就行啦). 二.创建完Unity ID并登录(或已有Unity ...

  3. 谈谈AssetStore及其脱离Unity下载方法

    AssetStore一直是Unity开发者又爱又恨的东西.首先这个生态绝对是先进的,并且越来越能够吸引高质量的开发者开发或开源他们的插件.它的缺点可能是大陆开发者尤为头疼的. 1.付费,客观的看99% ...

  4. Unity --- 触摸方法,以及灯光与烘培的使用

    触摸方法 1.首先触摸分为两大类:多点触摸和单点触摸 --- 这两种方式的触摸通过下面这个触摸数来进行判断,当其等于1的时候,为单点触摸,当其大于1的时候为多点触摸 2.当我们在调用触摸方法的时候我们 ...

  5. Unity Movetowards方法

    Movetowards方法 public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDe ...

  6. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑--方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  7. Unity导入3D模型的过程与方法

    一.介绍 资源是游戏开发中的原材料,也就是组成游戏的模块. Unity只是一个游戏开发引擎,而并不是一个资源开发软件.这就意味着在游戏中需要的资源通常是由一些设计者使用其他软件开发出来的,然后设计者会 ...

  8. 命令行开启一个unity实例和执行其中的脚本方法的使用和注意

    工作中有一个需求,就是将unity工程放在服务器上,自动执行一些打包任务.这时候就需要启动一个没有GUI的unity,并自动执行其中的打包脚本. 1.官网的说明: 官网API 2.一般的调用方法: 2 ...

  9. unity与安卓之间的调用简单使用方法

    1.首先下载Android Studio,配置unity安卓环境,SDK,jdk配置.网上很多教程. 2.创建AS项目,新添加一个模块Module,在新创建Module下的JAVA文件夹下的空文件夹添 ...

  10. webplayer和unity通信,互相调用方法

    昨天研究了一下web调用unity方法,给unity传送参数. 在网上找到了几个方法,最好用的是这个: <script type="text/javascript" lang ...

最新文章

  1. 已经导入jar包mysql还是报错_java通过JDBC连接数据库,老是报错:ClassNotFoundException.该导入的jar包我也已经导入了。...
  2. hadoop rebalance
  3. 机器学习速成课程 | 练习 | Google Development——编程练习:使用神经网络对手写数字进行分类
  4. block引用c语言数组,Block在ARC和MRC下的使用分析
  5. asp.net Forums2.0修改密码后无法登陆问题——都是Cache惹的祸
  6. oracle如何增加磁盘,牛刀小试Oracle之ORACLE 11GR2 RAC安装配置-asm磁盘组配置添加(四)...
  7. android framework 触摸屏事件传递
  8. Flutter进阶第2篇:Dio库实现网络请求以及动态渲染数据
  9. Python中的jquery PyQuery库使用小结
  10. 滴滴+头条+网易游戏研发面经
  11. CSS盒模型与box-sizing详解
  12. 毛孔很大很难看该怎么处理
  13. 测试点先发散后收敛思考
  14. Scrapy糗事百科爬虫实战代码分析
  15. 关于 如何写批处理文件
  16. linux发出声音的命令,在Linux中发出哔哔声C
  17. CSS的overflow属性简析
  18. 终于有人把3D打印讲明白了
  19. rx580显卡运行不了Linux,RX580吃鸡不流畅原因找到了 真相令人无语
  20. libnet编译linux,libnids libpcap libnet 安装

热门文章

  1. CSR8675烧录工具-全系列CSR8675/86xx一拖多量产工具csr烧录软件(支持FLASH版本和ROM版本)
  2. F28335的SCI模块
  3. 线性系统理论和设计 (仝茂达)习题答案
  4. 评分卡模型python实现
  5. phpcms开发微信小程序api
  6. fgo升级经验计算机,命运冠位指定FGO升级所需经验值介绍
  7. 超长时间序列数据可视化的6个技巧
  8. 微信小程序的事件冒泡和捕获
  9. 海森矩阵(Hessian Matrix)与泰勒展开式
  10. 三丰三坐标编程基本步骤_贴片机编程教程,编程步骤,编程怎么编