CharacterController2D

【Unity】项目源码——2D横版过关类游戏《A_Standard_Runner》 【摘要】这同样是sunset在学习Unity游戏制作过程中独立制作的游戏,游戏的操作与过关方式比较简单,整体制作时间大概两到三天中除去上课吃饭以及睡觉的剩余时间。虽然也出现了意想不到的小问题,不过整体制作过程中还算比较顺利。这篇博客就来说说如何制作一款这样的游戏的核心部分。 阅读详情
using UnityEngine;
using UnityEngine.Events;

public class CharacterController2D : MonoBehaviour
{
    [SerializeField] private float m_JumpForce = 400f;                          // Amount of force added when the player jumps.
    [Range(0, 1)] [SerializeField] private float m_CrouchSpeed = .36f;          // Amount of maxSpeed applied to crouching movement. 1 = 100%
    [Range(0, .3f)] [SerializeField] private float m_MovementSmoothing = .05f;  // How much to smooth out the movement
    [SerializeField] private bool m_AirControl = false;                         // Whether or not a player can steer while jumping;
    [SerializeField] private LayerMask m_WhatIsGround;                          // A mask determining what is ground to the character
    [SerializeField] private Transform m_GroundCheck;                           // A position marking where to check if the player is grounded.
    [SerializeField] private Transform m_CeilingCheck;                          // A position marking where to check for ceilings
    [SerializeField] private Collider2D m_CrouchDisableCollider;                // A collider that will be disabled when crouching

    const float k_GroundedRadius = .2f; // Radius of the overlap circle to determine if grounded
    private bool m_Grounded;            // Whether or not the player is grounded.
    const float k_CeilingRadius = .2f; // Radius of the overlap circle to determine if the player can stand up
    private Rigidbody2D m_Rigidbody2D;
    private bool m_FacingRight = true;  // For determining which way the player is currently facing.
    private Vector3 m_Velocity = Vector3.zero;

    [Header("Events")]
    [Space]

    public UnityEvent OnLandEvent;

    [System.Serializable]
    public class BoolEvent : UnityEvent<bool> { }

    public BoolEvent OnCrouchEvent;
    private bool m_wasCrouching = false;

    private void Awake()
    {
        m_Rigidbody2D = GetComponent<Rigidbody2D>();

        if (OnLandEvent == null)
            OnLandEvent = new UnityEvent();

        if (OnCrouchEvent == null)
            OnCrouchEvent = new BoolEvent();
    }

    private void FixedUpdate()
    {
        bool wasGrounded = m_Grounded;
        m_Grounded = false;

        // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground
        // This can be done using layers instead but Sample Assets will not overwrite your project settings.
        Collider2D[] colliders = Physics2D.OverlapCircleAll(m_GroundCheck.position, k_GroundedRadius, m_WhatIsGround);
        for (int i = 0; i < colliders.Length; i++)
        {
            if (colliders[i].gameObject != gameObject)
            {
                m_Grounded = true;
                if (!wasGrounded)
                    OnLandEvent.Invoke();
            }
        }
    }


    public void Move(float move, bool crouch, bool jump)
    {
        // If crouching, check to see if the character can stand up
        if (!crouch)
        {
            // If the character has a ceiling preventing them from standing up, keep them crouching
            if (Physics2D.OverlapCircle(m_CeilingCheck.position, k_CeilingRadius, m_WhatIsGround))
            {
                crouch = true;
            }
        }

        //only control the player if grounded or airControl is turned on
        if (m_Grounded || m_AirControl)
        {

            // If crouching
            if (crouch)
            {
                if (!m_wasCrouching)
                {
                    m_wasCrouching = true;
                    OnCrouchEvent.Invoke(true);
                }

                // Reduce the speed by the crouchSpeed multiplier
                move *= m_CrouchSpeed;

                // Disable one of the colliders when crouching
                if (m_CrouchDisableCollider != null)
                    m_CrouchDisableCollider.enabled = false;
            }
            else
            {
                // Enable the collider when not crouching
                if (m_CrouchDisableCollider != null)
                    m_CrouchDisableCollider.enabled = true;

                if (m_wasCrouching)
                {
                    m_wasCrouching = false;
                    OnCrouchEvent.Invoke(false);
                }
            }

            // Move the character by finding the target velocity
            Vector3 targetVelocity = new Vector2(move * 10f, m_Rigidbody2D.velocity.y);
            // And then smoothing it out and applying it to the character
            m_Rigidbody2D.velocity = Vector3.SmoothDamp(m_Rigidbody2D.velocity, targetVelocity, ref m_Velocity, m_MovementSmoothing);

            // If the input is moving the player right and the player is facing left...
            if (move > 0 && !m_FacingRight)
            {
                // ... flip the player.
                Flip();
            }
            // Otherwise if the input is moving the player left and the player is facing right...
            else if (move < 0 && m_FacingRight)
            {
                // ... flip the player.
                Flip();
            }
        }
        // If the player should jump...
        if (m_Grounded && jump)
        {
            // Add a vertical force to the player.
            m_Grounded = false;
            m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce));
        }
    }


    private void Flip()
    {
        // Switch the way the player is labelled as facing.
        m_FacingRight = !m_FacingRight;

        // Multiply the player's x local scale by -1.
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }
}

、、、、、、、

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

public class Player : MonoBehaviour
{

    public CharacterController2D m_CharacterController2D;

    public float runSpeed = 40f;

    float horizontalMove = 0f;

    bool jump = false;

    bool crouch = false;
    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed;
        if (Input.GetKeyDown(KeyCode.W))
        {
            jump = true;
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            crouch = true;
        }
        else if (Input.GetKeyUp(KeyCode.S))
        {
            crouch = false;
        } 
    }

    private void FixedUpdate()
    {
        m_CharacterController2D.Move(horizontalMove*Time.fixedDeltaTime, crouch, jump);
        jump = false;
       
    }
}

 

【Unity 2D 游戏角色控制插件】2D Character Controller 简化开发流程,轻松为游戏角色添加各种基本的运动与控制功能,无需从头编写复杂的控制系统 2D Character Controller 插件是 Unity 中专为 2D 平台游戏和其他类型 2D 游戏角色控制而设计的工具。它的目标是简化开发流程,使开发者能够轻松地为游戏角色添加各种基本的运动与控制功能,而无需从头编写复杂的控制系统。这款插件针对横版平台游戏或任何需要角色移动、跳跃、互动等基本操作的 2D 游戏,提供了高效、灵活的解决方案。 阅读详情

相关推荐

Unity3d 2D Character Controllers 官方资源

我根据2D Character Controllers做的一个教程

【截图整理官方教程】unity 2D角色控制器 2D Character Controller

整理截图自官方视频教程,unity2D角色控制器教程(基于untiy5修改)

让他让的博客 1万+

Unity终极角色控制器 Ultimate Character Controller 2.1.7.unitypackage

Ultimate Character Controller是是一款专业的运动角色控制器,旨在包括最流畅的第一和第三人称控制,并在所有领域表现出色:PC,移动,控制台,AI,网络和VR 它包含许多其他角色控制器中通常不具备的独特功能 - 从无缝的第一和第三人称视角切换到弹簧系统,允许流畅的,程序化的第一人称动画。其他独特功能包括能力系统,动态重力,以及能够根据每个角色更改时间刻度 运动特征控制器 第一和第三人称摄像机控制器 无缝切换视角 动态重力系统 高级移动平台系统 可扩展能力系统 支持双重挥舞 程序性弹簧动画 全身意识 可见轨迹曲线 反向运动学(IK) 各种各样的可射击武器 各种近战武器

推荐开源项目:CharacterController2D —— 为你的2D游戏打造稳固的控制器

推荐开源项目:CharacterController2D —— 为你的2D游戏打造稳固的控制器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 CharacterController2D 是一款专为Unity设计的2D角色控制器组件,它类似于Unity内置的CharacterController,但特别针对2D游戏系统进行了优化。这个开源项目提供了一个简洁的API,主要...

gitblog_00051的博客 747

在AutoDL的A100云服务器上,用Docker搞定Sapien+RobotWin环境(附完整conda list)

本文详细介绍了在AutoDL的A100云服务器上使用Docker构建Sapien+RobotWin环境的完整指南。通过配置Vulkan渲染管线、精确复现Conda环境以及解决常见问题,帮助研究人员高效搭建稳定的机器人仿真开发环境,特别适合需要高性能GPU加速的复杂仿真任务。

weixin_30689307的博客 431

在 Ansys Mechanical 中使用“螺栓工具”插件自动生成螺栓

在有限元分析 (FEA) 中,高效创建螺栓连接对于确保机械装配的结构完整性和性能至关重要。螺栓是连接组件不可或缺的一部分,它们在负载下的精确建模会影响整个系统。快速高效的螺栓建模使工程师能够快速优化设计,满足紧迫的期限,并通过为其他关键设计任务释放资源来提高整体生产力。此外,螺栓建模的精度可以最大限度地降低模型创建过程中出错的风险,这对于获得可靠和准确的分析结果至关重要。因此,在 FEA 中快速且无错误地创建螺栓连接对于高效、可靠和成功的工程结果至关重要。

jkh920184196的博客 3101

Unity笔记(4):Character Controller Move【2D】

涉及到的功能有:刚体、碰撞体、脚本角色控制器的代码基本上已经形成了一种套路,所以直接在官方的代码上略作修改即可。

有朋自远方来,不亦乐乎。 2132

CarPlay wired(USB)连接方案

CarPlay的wired(USB)的连接方案要求车载设备至少要支持USB2.0 Hi-Speed,支持USB Host Mode,该模式要求车载设备能够工作在USB device模式下,因为Apple设备在CarPlay中是作为USB Host的。而通常情况下,车载设备USB是工作在USB Host模式的,而外接的USB设备是工作在USB Device模式的,因而在这种情况下的CarPlay wired(USB)连接方案中就需要进行USB的模式切换。模式切换完成后便是Apple设备(USB HOST)的枚

Ke8323的博客 1万+

Unity之CharacterController2D学习笔记(1)——基础使用

在很多游戏类型中,玩家角色对物理行为的处理往往和场景中其它物体的行为有比较大的区别。比如角色可能会以90多公里的时速狂奔,同时一次跳跃能跳10多米高,与此同时却几乎不会有任何惯性。同时角色在正常情况下当头部碰到障碍物的时候,应该只是会被阻挡前进,而不应该直接仰面摔倒。这些特殊的需求注定不应该以普通的碰撞区+刚体的形式来实现,所以unity为我们准备了名叫“角色控制器”(CharacterContr...

weixin_30521161的博客 835

YOLOv8首发优化:遥感目标检测 | 专为低质量遥感图像设计的边缘 - 高斯聚合(EGA)模块,解决低空间分辨率、传感器噪声、目标模糊、低光照退化和部分遮挡等限制

一种轻量级网络,其创新性地整合了专为低质量遥感图像设计的边缘 - 高斯聚合(EGA)模块。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 492

极智AI | 详解 ViT 算法实现

大家好,我是极智视界,本文详细介绍一下 ViT 算法的设计与实现,包括代码。

极智视界 5604

【博物纳新】2D开源库合辑推荐

自从推出了博物纳新栏目,小编就陷入了选择困难症,没办法谁让开源库的项目都这么优秀,每个都想推荐给大家!索性今天发放大礼包——铛铛铛~ 1. CharacterController2D CharacterController2D可以帮助你快速制作一个2D角色,它类似于Unity内置的 CharacterController组件2D版。原理上通过射线检测判断障碍物并改变角色的方向、速度,从而让你的...

UWA—简单优化,优化简单! 344

时空智友企业流程化管控系统文件上传漏洞

时空智友企业流程化管控系统是一个功能丰富、灵活可定制的企业管理工具。通过该系统,企业能够实现流程的自动化、协同的提升、数据的洞察和决策的优化,从而提高工作效率、管理水平和企业竞争力。时空智友企业流程化管控系统 formservice接口处存在任意文件上传漏洞,未经认证的攻击者可通过此接口上传后门文件,最终可导致服务器失陷。

holyxp的博客 1032

Unity创建一个可移动的2D角色

我们首先创建一个角色,这里我新建了一个胶囊体用来当Player,一个Square用来当地面。 接下来,为角色增加碰撞体和刚体,为地面增加碰撞体。然后我们为Player的刚体增加一个Z轴的约束,避免其东倒西歪。如下图所示: 同时,为角色添加一个空物体作为子物体,用来向地面发射射线,检测是否触碰到了地面。 将Ground Check置于角色的脚底。接下来我们要新建一个Layer,用于表示地面。 将Square改名为Ground,并修改其Layer为Ground。 接着新建一个CharacterControll

充满智慧的博客 1815

基于ResNet + LLM大语言模型的分类识别系统设计与实现,Web前后端分离,Django+vue3+AI助手模块+ResNet50算法+LLM 联动+Element Plus等技术,全网独发

分类识别任务是计算机视觉中的重要任务,广泛应用于智慧校园分类、智慧农业、智慧生活场景分类等领域。常见的分类模型有 VGGNet、ResNet 、MobileNet 、ConvNeXt、DenseNet、ViT、Swin Transformer、YOLOv8/11/26。本项目结合 ResNet分类识别算法 + LLM大语言模型联动 ,使用 Django + Vue3,构建了一个通用的 Web 前后端系统,用户端 + 管理端 ,便于用户操作检,不仅可以用于大论文的工作量展示,还可以作为毕业设计。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 760

从零开始学 AUTOSAR:深入浅出 SAE J1939 诊断通信管理器(J1939Dcm)深度完整版

SAE J1939 是美国汽车工程师学会制定的重型车辆 CAN 总线通信标准,覆盖卡车、客车、工程机械、农机、船舶等,是商用车领域的 “通用语言”。基于CAN 2.0B 扩展帧(29 位 ID)(车规主流)PGN(参数组号)+ SPN(可疑参数号)核心标准:J1939-21:数据链路层(CAN 帧格式、地址声明)J1939-71:应用层(普通信号、报文)诊断层(核心!J1939Dcm 依据)J1939-81:网络管理(地址管理、节点检测)

getusushu的博客 117

Unity 简记(2)--2D移动

Unity 笔记(2)–2D移动 文章目录Unity 笔记(2)--2D移动1.输入1.1直接检测按下哪个按键1.2.检测水平输入和垂直输入2.移动2.1.Transform组件2.2.RigidBody组件2.3.NavMeshAgent组件2.4.CharacterController组件2.5.Vector 33.手感优化4.符合自己的游戏 1.输入 Unity输入方式有三种: 1.1直接检...

AM的博客 5504

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Unity 2D Platformer Controller 项目教程

Unity 2D Platformer Controller 项目教程 1. 项目目录结构及介绍 2d-platformer-controller/ ├── Assets/ │ ├── Gifs/ │ ├── Packages/ │ ├── ProjectSettings/ │ └── gitignore ├── LICENSE.md ├── README.md └── 其他文件和...

gitblog_00116的博客 694

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

U2D【Move and Jump】

在Unity中控制角色的简单移动和跳跃可以通过多种方法实现。

🌟【AI炼丹师 | 你的数字技术搭子】 大二解锁3200+道友同行👾 1531

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TopDown Engine中文文档 (九角色类)

八.角色类 1.介绍 引擎中的每个角色都需要许多组件才能工作。其中一些是2D的细节,有些是3D的细节。其中大多数都很共用。此页面将为您提供主要的信息,您需要知道如何在TopDown引擎中平稳地创建角色。 2.2D特有组件 如果你要使用一个2D角色,你需要一个RigidBody2D组件(Dynamic, Continuous Collision Detection, Start Awake, Interpolate),以及一个BoxCollider2D(non trigger)。设置Coll.

萧寒大大 812

Unity中物体移动方式

分别代表速度向量在X、Y、Z轴上的分量(2D物体没有Z轴)。通过设置这些值,你可以精确控制物体在每个方向上的移动速度。忽然改变速度可能会导致穿透其他物体或者产生不连续的动画效果。

qq_60536076的博客 2226

Unity — Physics 物理

Unity 中提供了许多功能和服务,包括完整的物理系统。您可以在 Unity 项目中模拟游戏物理,以确保正确的碰撞检测、碰撞解决和空间查询。 物理性质:

小云同志你好的博客 359

unity复制出来的敌人_Unity面试题精选(7)

洪流学堂,让你快人几步。本篇文章首发于我的公众号:洪流学堂整理了一些Unity面试题目,希望可以帮助到你。 面试官:简述一下对象池,你觉得在FPS里哪些东西适合使用对象池?答:对象池就存放需要被反复调用资源的一个空间,当一个对象回大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如...

weixin_33821888的博客 192

unity 2d 人物移动代码

好的,在 Unity 中实现 2D 人物移动的方法有很多,下面是一个基本的实现方式: 首先,你需要在场景中添加一个移动控制器(如 Rigidbody2D 或 CharacterController2D),并将人物的游戏对象作为其子对象。 然后,你可以使用 Input.GetAxis("Horizontal") 和 Input.GetAxis("Vertical") 来获取用户的水平和垂直输入,并使...

weixin_35756373的博客 1310

Unity之物理系统

概述 1. 当游戏对象运行在场景中进行加速或碰撞时,需要Unity的物理引擎系统为玩家展示最为真实的物理效果。 2. Unity内置了一个3D物理引擎和一个2D物理引擎,用法基本相同,但是需要使用不同的组件实现。 物理系统相关组件及参数详解 Rigidbody组件 1. 为游戏对象添加RigidBody组件,实现该对象在场景当中的物理交互。当游戏对象添加了Rigidbody组件后,游戏对...

Tokyo_2024的博客 3098

Unity的一些笔试题

在网络上搜到的一些Unity笔试题,下面解答部分为本人重新编写的,希望帮到大家! 1.请描述游戏动画有哪几种,以及其原理。 主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。 关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画。 单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记...

ZWM990425424的博客 679
上一篇: 二进制和XML的序列化和反序列化&&AB
下一篇: 深入理解协程
Edision_li
博客等级 码龄9年 657粉丝 91原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值