01_Unity常用的移动方法

article/2025/11/10 20:47:05

文章目录

  • 基础框架
  • 匀速移动
  • 变速移动
  • 自定义变速运动
  • 总结:

在制作一款游戏的时候,经常需要对物体的位置进行移动,我们希望这个移动是具有多样性的,并且可操作的。

C#中提供了非常丰富的移动代码工具,通过这些工具我们可以实现:匀速移动、变速移动、自定义变速移动等移动方式。

基础框架

实现一个Unity中可以挂接的类包含的基本框架是:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class VecMove : MonoBehaviour
{private void Start(){//代码初始时调用}private void Update(){//每帧调用一次}// 本次博文中使用的private void OnGUI(){// 每帧调用一次,用于GUI操作的判断}}

== 为了更加直观的展示移动,本次博文在OnGUI中调用移动方法,通过点击移动按钮查看移动过程 ==

更一般的情况,可能是在Updat()中调用。
注意!下面的方法填充在OnGUI()中。

匀速移动

if(GUILayout.RepeatButton("匀速移动"))
{this.transform.position = Vector3.MoveTowards(objectPos, targetPos, moveFactor);
}

点击移动按钮即可实现匀速移动,其中objectPos是当前物体的位置,targetPos是目的物体的位置,moveFactor是每一帧移动的距离。

变速移动

if(GUILayout.RepeatButton("变速移动"))
{this.transform.position = Vector3.Lerp(objectPos,targetPos, moveFactor);
}

从objectPos 移动到 -> targetPos ,每次移动的距离是二者distance*moveFactor的距离。

当前物体的位置一直在靠近目标位置,因此这个移动距离不断变小,并且永远不可达,只能无限靠近。

自定义变速运动

public AnimationCurve curve;        // x轴是移动时间,y轴是移动量
public float x;
if(GUILayout.RepeatButton("自定义变速"))
{x += Time.deltaTime / moveDalayTime;this.transform.position = Vector3.Lerp(objectPos, targetPos, curve.Evaluate(x));
}
if(GUILayout.RepeatButton("自定义变速2"))
{x += Time.deltaTime / moveDalayTime;this.transform.position = Vector3.LerpUnclamped(objectPos, targetPos, curve.Evaluate(x));
}

可以在Unity界面自定义移动曲线

  1. 其中curve设置为public,可以在unity界面进行设置曲线
    在这里插入图片描述
    2.这个曲线如果设置成如下的样子:(超过终点,再回来)
    在这里插入图片描述

使用Vector3.Lerp会默认到达目的地为最终结果
使用Vector3.LerpUnclamped会严格按照曲线运动,超过目的地再回来

总结:

几种常用的移动方式代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 
/// </summary>
public class VecMove : MonoBehaviour
{private Vector3 targetPos = new Vector3(0, 0, 10);public float moveFactor = 0.1f;public AnimationCurve curve;        // x轴是移动时间,y轴是移动量public float moveDalayTime = 1.0f;  // 移动到目的地花费的时间private float x;private Vector3 objectPos;private Vector3 originPos;void Start(){objectPos = this.transform.position;originPos = this.transform.position;}void Update(){}void OnGUI(){if(GUILayout.RepeatButton("复位")){objectPos = this.transform.position;this.transform.position = originPos;x = 0;}if(GUILayout.RepeatButton("匀速移动")){objectPos = this.transform.position;this.transform.position = Vector3.MoveTowards(objectPos, targetPos, moveFactor);}if(GUILayout.RepeatButton("变速移动")){this.transform.position = Vector3.Lerp(objectPos,targetPos,moveFactor);}// 起点固定,终点固定,运动根据曲线来if(GUILayout.RepeatButton("自定义变速")){x += Time.deltaTime / moveDalayTime;this.transform.position = Vector3.Lerp(objectPos, targetPos, curve.Evaluate(x));}// 上面的是超过终点就算是终点,如果想要超过终点还能回来,就使用下面的方法if(GUILayout.RepeatButton("自定义变速2")){x += Time.deltaTime / moveDalayTime;this.transform.position = Vector3.LerpUnclamped(objectPos, targetPos, curve.Evaluate(x));}}
}

关注我,一起进步吧~

  • bilibili 打工人小棋

  • 知乎 打工人小棋

  • CSDN 打工人小棋


http://chatgpt.dhexx.cn/article/OnOxo6ii.shtml

相关文章

Unity点击物体后,移动到物体所在位置

Unity点击物体后&#xff0c;移动到物体所在位置 方法一&#xff1a;OnMouse检测&#xff08;需要Collider组件&#xff09; 脚本挂在被点击的物体上 using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;/// <summary> /// 缺点…

Unity2D教程:人物移动

关注专栏&#xff0c;持续更新哦 教程总目录 按键 自带的Input有GetAxisRaw来获取按下按键后所对应的值&#xff0c;Input.GetAxisRaw(“Horizontal”)在按下D或右箭头返回1&#xff0c;A或左箭头返回-1&#xff1b;Input.GetAxisRaw(“Vertical”)同理。 Input.GetAxis会根…

Unity物体跟随鼠标移动

刚开始在将鼠标点转换为世界坐标时&#xff0c;我以为可以直接使用Unity的Camera.main.ScreenToWorldPoint( Input.mousePosition ) 就完事了&#xff0c;事实证明我想的太简单了。在我们使用这个API将鼠标屏幕点&#xff08;Screen&#xff09;转换成世界坐标&#xff08;Worl…

Unity中物体移动方法详解

一&#xff1a;Transform ——transform.Translate&#xff1a;不会考虑到碰撞transform.Translate(Vector3 targetPos&#xff0c;指定参照坐标系(默认为Space.Self)) ——transform.position&#xff1a;直接改变物体的坐标 二&#xff1a;刚体 ——MovePosition ——veloc…

【Unity】如何优雅地移动物体-8个方法

在游戏开发中&#xff0c;如何移动物体&#xff1f;是我们需要思考的事情。 Unity 引擎也提供了众多的方法&#xff0c;每个开发者的使用习惯也各不相同&#xff0c;所以往往不是很清楚在这种场景下哪种方式最好的或者最有效的。 那么&#xff0c;这篇文章&#xff0c;我想分享…

详解Unity的几种移动方式实现

前言 最近在学习如何制作 FPS 游戏&#xff0c;学习了如何使用角色控制器来控制角色的移动跳跃等等&#xff0c;结合之前学到的使用 transform&#xff0c;刚体等使物体移动&#xff0c;不同的移动方式适用于不同的场景&#xff0c;今天就来简要盘点一下各种移动方式以及其优劣…

unity物体四种移动方法总结

目录 一.通过修改位置来实现移动 二.通过物理系统实现位移 三.通过输入控制物体移动 一.通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法。 1.使用Translate&#xff08;&#xff09;函数。 2.&#xff0c;直接指定新的位置 将上述两种方法在void …

详解Unity的移动控制实现

前言 上一篇写了数种Unity中的移动方式&#xff0c;有物理移动&#xff0c;有非物理移动等&#xff0c;这篇我们来谈谈Unity中的移动控制方式&#xff0c;来结合上一篇所说的方法&#xff0c;用起来。一般控制是通过获取用户输入来处理角色移动逻辑的&#xff0c;而用户输入的…

JSON数据和解析

JSON> JavaScript Object Notation JSON是一个字符串 常常用于网络传输数据的一种字符 json数据是一种轻量级的数据交换格式&#xff0c;它基于一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语…

Android开发之JSON数据解析详解(一)

&#xfeff;&#xfeff; 今天很高兴和大家一起学习Android的JSON数据解析,可能对于学习安卓的朋友都知道JSON在数据解析方面已经很普遍了.所以也是我们必定要了解的知识 ,下面让我们了解一下JSON的发展历程. XML——这种用于表示客户端与服务器间数据交换有效负载的格式&am…

Android开发json数据解析

在Android开发过程中&#xff0c;或更新数据&#xff0c;或为减轻手机负担将大部分复杂运算交由服务器来进行&#xff0c;都需要与服务器之间进行数据交互&#xff0c;数据交互中&#xff0c;使用的较为频繁的格式变为json数据&#xff0c;书写便捷&#xff0c;操作方便&#x…

JSON解析data数据

之前 是用JSONObject去解析data后来就报错 com.alibaba.fastjson.JSONException: expect : at 0, actual

JSON数据解析 之JSONPath

一&#xff1a;JSONPath说明&#xff1a; JSONPath是一种通过配置正则表达式语法&#xff0c;抽取json中的指定数据的一种类库&#xff1b; 二&#xff1a;需要的jar依赖&#xff08;依赖阿里巴巴的fastjson.jar&#xff09; maven用户可通过maven远程仓库获取配置地址 <…

一文搞懂JSON及JSON数据解析

文章目录 前言一、XML1、简介2、XML解析方式2.1、SAX解析方式2.2、DOM解析方式2.3、JDOM解析方式2.4、DOM4J解析方式 二、JSON1. 简介及其语法格式2. 解析方式2.1 GSON解析2.1.1 对象转换为JSON字符串2.1.2 JSON字符串转换为对象 2.2 fastjson2.2.1 对象转换为JSON字符串2.2.2 …

c语言解析json数据

我使用的是cJSON: http://sourceforge.net/projects/cjson/ 先看json的数据结构 c中没有对象&#xff0c;所以json数据是采用链表存储的 C代码 typedef struct cJSON { struct cJSON *next,*prev; // 数组 对象数据中用到 struct cJSON *child; // 数…

JSON数据解析(GSON方式)

Android技术学习&#xff0c;更多知识请访问https://www.itkc8.com     JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;采用完全独立于语言的文本格式&#xff0c;为Web应用开发提供了一种理想的数据交换格式。 在上一篇…

android studio json数据解析汇总(备忘)

之前写过一个&#xff0c;但是写不太全&#xff0c;结果自己都看不懂&#xff0c;希望这个以后能看懂吧。 以两个例子说明json数据解析&#xff0c;一个是最简单的&#xff0c;一个是比较难的。 必须知道的&#xff1a;JSONObject和JSONArray JSONObject是在{ }内的。如{&qu…

json解析数据详解

对于服务器端来说&#xff0c;返回给客户端的数据格式一般分为html、xml和json这三种格式&#xff0c;那么本篇随笔将讲解一下json这个知识点&#xff0c;包括如何通过json-lib和gson这两个json解析库来对解析我们的json数据&#xff0c;以及如何在我们的Android客户端解析来自…

Python3 JSON数据解析

JSON是一种比轻量级的数据交换格式。比XML更小、更快、更容易解析。 JSON语法时JavaScript对象表示语法的子集。书写格式为&#xff1a;键:值。用英文逗号为分隔符&#xff0c;{}大括号报错对象&#xff0c;[]中括号报错数组。 python3中使用json模块对JSON进行编码和解码&am…

json数据解析 jsonpath

json是一种文本数据交换格式&#xff0c;不是一种语言 jsonpath是一种语法&#xff0c;用于json数据&#xff0c;类似xpath用于html 1.json.dumps json.loads 需要import json json.dumps——将python数据转化为json数据 实际上就是将python里面的字典转化成json格式的数…