[Unity2D]在2D游戏里面实现人物的移动[消除抖动]

2023-11-13

[Unity2D]在2D游戏里面实现人物的移动

先来一张效果图:
在这里插入图片描述

一般的Unity2D游戏中

用WASD控制来移动人物角色的移动
缺陷:与含有碰撞器的强行碰撞时会发生抖动
原因:例如我人物要向左边走,利用脚本获取键盘输入,给人物角色一个向左边的力,物体会向左边走,但是物体有碰撞器,发生碰撞检测后,会给物体一个方向相反的力,让其向右边走。
在这里插入图片描述
2D人物需要添加的组件:Rigidbody2D、注意将其 Gravuty Scale设置为0,不然2D人物会发生平面掉落,如果不冻结Freeze Rotation的Z轴,人物还会发生旋转,冻结这些角度就是为了让其发生碰撞时不会发生旋转,对于一些加了碰撞器的组件和Rigidbody2D的物体,一般会冻结它的Freeze Position的X,Y轴以及其Freeze Rotation,既不让它碰撞后移动,也不让他旋转在这里插入图片描述
人物没有归零重力和冻结旋转的效果,可以发现人物发生了自然下落以及碰撞物体后的转向
在这里插入图片描述
那么如果场景没有冻结呢?
在这里插入图片描述
这主要是针对一些物体,如果给他加了Tilemap Collider后会自动给他加上Rigidbody2D,记得要归零其重力
在这里插入图片描述
代码如下:

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

public class PlayerMove : MonoBehaviour
{
    private float horizontal;
    private float vertical;
    public float MoveSpeed=3;
    
    Vector2 Player_Move;
    
    void Start()
    {
        Application.targetFrameRate = 45; //控制游戏界面刷新的频率 可写可不写 不写默认60次
    }

    void Update()
    {
        float h = Input.GetAxis("Horizontal");  //获取水平轴的输入
        float v = Input.GetAxis("Vertical");    //获取纵轴的输入
        
        Vector2 position = transform.position;    //创建一个二维变量
        position.x = position.x + MoveSpeed * h * Time.deltaTime;  //更新变量
        position.y = position.y + MoveSpeed * v * Time.deltaTime;  //更新变量
        
        transform.position = position;  //赋值更新变量
    }
}

如何去消除抖动?
方法:需要使控制人物角色移动的力相同,都用物理属性来控制
代码如下:

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

public class PlayerMove : MonoBehaviour
{
    private float horizontal;
    private float vertical;
    public float MoveSpeed=3;

    public int maxHealth = 5;  //定义生命值
    private int curHealth;

    Rigidbody2D rigidbody; 

    Vector2 Player_Move;
    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 45; //刷新频率
        rigidbody = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector2 position = transform.position;
        position.x = position.x + MoveSpeed * h * Time.deltaTime;
        position.y = position.y + MoveSpeed * v * Time.deltaTime;
        //transform.position = position;  // 用统一的方法移动Ruby
        rigidbody.MovePosition(position);  //利用rigidbody来移动人物
    }
}

最终效果如下
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Unity2D]在2D游戏里面实现人物的移动[消除抖动] 的相关文章

  • Linux系统安装配置curl

    1 获得安装包 从网上直接下载或者其他途径 这里直接wget wget http curl haxx se download curl 7 20 0 tar gz 2 解压到当前目录 或者 http www linuxidc com Lin

随机推荐

  • 贝叶斯方法应用:检测时间序列拐点

    随着时间推移 制造设备比如贴片机的位置由于各种原因会产生小的偏差 这些偏差可能是阶跃 也有可能是渐变的形式 由于偏差值很小 产线的自动光学检测设备并不会报警 然而小的偏差如果不经处理 经过一定时间累积会产生较大偏差 影响产品质量 为了能够提
  • 最好看的代码雨特效

    上代码
  • 2010年10大热门的开源NoSQL服务器软件

    NoSQL 就是反SQL 是一项全新的数据库革新运动 特别是在 2010 年得以迅猛发展 而各种开源的 NoSQL 软件突然间涌现在你面前 目前似乎没有对 NoSQL 给出一个标准的定义 也没有相应的规范 但从这些软件可以看出 NoSQL
  • WCF 第五章 一个单一实例中的多线程

    默认的InstanceContextMode行为设置指导WCF为每个请求创建一 个新的服务实例 然后在很多情况下 这不是最好的解决方案 例如 如果一个服务有一个代价很高的例行初始化 比如 一个构造器从一个数据库读取数据或者创 建一个大的内存
  • Linux OpenGauss 数据库远程连接

    目录 前言 1 Linux 安装 openGauss 2 Linux 安装cpolar 3 创建openGauss主节点端口号公网地址 4 远程连接openGauss 5 固定连接TCP公网地址 6 固定地址连接测试 前言 openGaus
  • carla二次开发(一)自定义创建地图

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 为什么创建carla地图很困难 二 官方创建方法 三 blender插件创建地图 四 City Engine创建地图 五 ue4创建地图 前言 carla
  • 某A类网络10.0.0.0的子网掩码255.224.0.0,请确定可以划分的子网个数,写出每个子网的子网号及每个子网的主机范围。

    某A类网络10 0 0 0的子网掩码255 224 0 0 请确定可以划分的子网个数 写出每个子网的子网号及每个子网的主机范围 可以确定划分的子网有2 3 2 6个 子网号 10 32 0 0主机范围 10 32 0 1 10 63 255
  • 数据结构计算题

    1 将下列函数按它们在 n 时的无穷大阶数 从小到大排列 n n n3 7n5 nlogn 2n 2 n3 log2n n1 2 log2n 3 2 n n n2 log2n 解答 log2n n1 2 log2n n nlog2n n2
  • c语言a b等于c的编程,简单的a+b (C语言代码)

    解题思路 题目中要求多次输入 所以需要一个死循环来进行控制 一般采用while 1 或者for 注意事项 scanf 函数需要加上取地址符 且它的返回值 它的返回值可以分成三种情况 1 正整数 表示正确输入参数的个数 例如执行 scanf
  • Java学习笔记——String类

    目录 API概述 案例 键盘录入字符串 String 概述 String类的常见构造方法 创建字符串对象的区别 String常见的面试题 字符串的比较 案例 用户登录 遍历字符串 案例 手机号屏蔽 字符串截取方法 案例 敏感词替换 字符串替
  • 决策树概述+模块介绍+重要参数(criterion+random_state&splitter+减枝参数+目标权重参数)+回归树(参数+实例+拟合正弦曲线)+泰坦尼克号生存者预测实例

    文章目录 什么是sklearn 一 决策树概述 一 概述 二 基础概念 三 决策树算法的核心是要解决两个问题 二 模块sklearn tree的使用 一 模块介绍 二 使用介绍 三 重要参数 一 criterion 二 random sta
  • JavaScript_day02

    文章目录 BOM与DOM操作 BOM操作 window子对象 history对象 location对象 掌握 弹出框 计时器相关 DOM操作 查找标签 节点操作 innerText 和 innerHTML 获取值操作 class css操作
  • 电机控制基础——定时器捕获单输入脉冲原理

    1 问题引出 在单片机与嵌入式开发中 某些场景需要捕获传感器的高电平 或低电平 信号的持续时间 如红外解码信号 编码器输入信号等 如下图 以单一的一段高电平输入信号为例 如何测量这段高电平的时间呢 从直观上理解 就是要不断的检测这个信号 当
  • IPv6与Volp

    文章目录 前言 1 IP v4与IP v6 1 1 IP v4的概念与存在的问题 1 2 ipv6概述 1 3 对比IP v4 IP v6的优点 1 3 ipv4与ipv6的包头比较 1 4 IP v6的基本术语 1 5 IP v6地址表示
  • 自主异常检测算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码 数据 4 参考文献 1 概述 文献来源 本文介绍了一种在实证数据分析
  • Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁 它能阻塞一组线程直到某个事件的发生 栅栏与闭锁的关键区别在于 所有的线程必须同时到达栅栏位置 才能继续执行 闭锁用于等待事件 而栅栏用于等待其他线程 CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集
  • docker容器将系统盘空间占满的解决办法

    最近遇到一个问题 线上服务器的系统盘空间被占满了 导致服务不能正常运行了 docker启动时会报出下面这个错误 no space left on device 排查用到的命令 显示当前路径下占用空间超过1G的文件或文件夹 du h max
  • AD 原理图统一隐藏元器件的参数和序号

    AD 原理图统一隐藏元器件的参数和序号 如果隐藏元件参数 元件 右击 查找相似对象 确定 点击原理图 ctrl a 点击 属性对话框中 Part Conmment Hide 统一隐藏元件参数 如果隐藏元件序号 元件 右击 查找相似对象 确定
  • 用JAVA中的URL获取网页相关信息

    ava中有一个URL类 可以获取指定url的内容 import java io BufferedReader import java io InputStreamReader import java net URL public class
  • [Unity2D]在2D游戏里面实现人物的移动[消除抖动]

    Unity2D 在2D游戏里面实现人物的移动 先来一张效果图 一般的Unity2D游戏中 用WASD控制来移动人物角色的移动 缺陷 与含有碰撞器的强行碰撞时会发生抖动 原因 例如我人物要向左边走 利用脚本获取键盘输入 给人物角色一个向左边的