实现物体的移动--刚体和代码中操控位置移动

文章介绍了在Unity中如何实现物体的移动,包括给物体添加碰撞体积和绑定刚体,以及利用Rigidbody2D进行位置更新。同时,文章提到了使用InputAction来处理玩家的跳跃输入,包括短跳和长跳功能,通过判断和更新刚体位置实现物体的动态移动。
摘要由CSDN通过智能技术生成

实现物体的移动

先让物体有碰撞体积

给物体绑定刚体

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZECQOvm5-1676354680561)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230212092520374.png)]

其他的属性和使用方法可以到文档里查看,文档真的超级详细。

但是光有碰撞规则是不行的,我们要为它加一个刚体。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ygsKYeBp-1676354680562)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230212094600407.png)]

将对应函数绑定好:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItvYxx4W-1676354680562)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230214091433207.png)]

然后我们编写代码,具体的思路就是设计青蛙的跳跃距离,然后算好目的地位置,之后该变它身上刚体的位置。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayController : MonoBehaviour
{
   
   //用于记录绑定在对象上面的刚体
   private Rigidbody2D rb;

   //可以被外部设置的参数,表示每次跳的距离量
   public float jumpDistance;

   //不可被外部调用的变量,表示实际跳跃的距离】
   private float moveDistance;

   //判断玩家是否已经满足对应的长按操作要求
   private bool buttonHeld;

   //最后位置
   private Vector2 destination;

   //判断当前是否处于跳跃状态
   private bool isJump;

   //钩子函数,比start更早
   private void Awake()
    {
      //把对象上面的刚体赋值给创建好的刚体对象
      rb = GetComponent<Rigidbody2D>();
   } 

   private void Update() {
      //判断是否跳完
      if(destination.y - transform.position.y < 0.1f)
      {
       isJump = false;
      }
   }

   //周期函数,每0.02秒执行一次,判断对象位置是否已经以为我们的操作引起改变
   private void FixedUpdate() {
        //Vector2.Lerp(当前位置, 最终位置, 移动幅度)
      if(isJump)
      {
         rb.position = Vector2.Lerp(transform.position, destination, 0.134f);
      }
   }

   //短跳函数
   public void Jump(InputAction.CallbackContext context)
   {
      
      //TODO:这个todo是标记我们要在这个函数里做什么,除此之外没什么蛋用。

      //如果玩家已经达到操作触发要求,那么打印 “起跳!!!!!”
      // if(context.phase == InputActionPhase.Performed)等同于下面的
      if(context.performed && !isJump)
      {
         moveDistance = jumpDistance;
         // Debug.Log("起跳!!!!!" + "点击跳跃跳了" + moveDistance + "米远。");
         //计算此时的位置
         destination = new Vector2(transform.position.x, transform.position.y + moveDistance);
         isJump = true;
      } 

   }
   
   //长跳函数
    public void LongJump(InputAction.CallbackContext context)
    {
   
      if(context.performed && !isJump) 
      {
         buttonHeld = true;
      }

      //如果玩家已经松开了按键   
      if(context.canceled && buttonHeld == true && !isJump)
      {
         //计算距离
         moveDistance = jumpDistance * 2;
         // Debug.Log("起跳!!!!!" + "点击跳跃跳了" + moveDistance + "米远。");
         //计算此时的位置
         destination = new Vector2(transform.position.x, transform.position.y + moveDistance);
         isJump = true;
         
         //还原
         buttonHeld = false;
      }
   
    }

   
}

Unity使用刚体移动物体,可以通过改变刚体的速度、力、加速度等属性来实现。以下是一些常用的方法: 1. 通过设置刚体的速度来移动物体: ```csharp public Rigidbody rb; public float speed; void Update() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.velocity = movement * speed; } ``` 2. 通过施加力来移动物体: ```csharp public Rigidbody rb; public float speed; void FixedUpdate() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement * speed); } ``` 3. 通过改变刚体位置移动物体: ```csharp public Rigidbody rb; public float speed; void Update() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.MovePosition(transform.position + movement * speed * Time.deltaTime); } ``` 需要注意的是,这些方法,使用了不同的更新函数。第一种方法使用了Update函数,第二种方法使用了FixedUpdate函数,第三种方法使用了Update函数。这是因为刚体的物理计算是在FixedUpdate函数进行的,所以如果需要在物理计算之前改变刚体的属性,应该使用FixedUpdate函数。而如果只是需要在每一帧更新物体位置,可以使用Update函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值