首页 > 其他分享 >Unity引擎2D游戏开发,撞墙判定和等候计时

Unity引擎2D游戏开发,撞墙判定和等候计时

时间:2023-12-25 17:12:47浏览次数:28  
标签:撞墙 Vector2 transform physicsCheck 2D Unity 判定 faceDirect public

撞墙判定

将野猪绑定Physics Check脚本,并将Ground Layer选中Ground,调整Button Offset到脚边,Check Radius为0.1,即可判定悬崖
image

physics Check脚本中添加一些变量,用于墙壁判定逻辑

public bool touchLeftWall;
public bool touchRightWall;

public Vector2 leftOffset;
public Vector2 rightOffset;

接着在Check()方法中,写入以下代码

// 墙体判断
touchLeftWall = Physics2D.OverlapCircle((Vector2)transform.position + leftOffset, checkRadius, groundLayer);
touchLeftWall = Physics2D.OverlapCircle((Vector2)transform.position + rightOffset, checkRadius, groundLayer);

接着在OnDrawGizmosSelected()方法中写入以下代码进行绘制

Gizmos.DrawWireSphere((Vector2)transform.position + leftOffset, checkRadius);
Gizmos.DrawWireSphere((Vector2)transform.position + rightOffset, checkRadius);

然后野猪和玩家身上会多出两个锚点,将那两个锚点进行移动,移动至身体两侧
image

image

自动获取碰撞体锚点

Physics Check代码中,添加一行全局变量

// 自动或手动找到碰撞体位置
public bool manual;

Awake()方法内,增加如下代码

if(!manual)
{
    rightOffset = new Vector2((capsuleCollider.bounds.size.x + capsuleCollider.offset.x) / 2, capsuleCollider.bounds.size.y / 2);
    leftOffset = new Vector2(-rightOffset.x, rightOffset.y);
}

解决碰撞体碰撞却没有判定的问题

将Composite Collider 2D中Geometry Type修改为Polygons
image

Outlines为,边缘线部分进行判定
Polygons为,内部整体作为判定

碰墙转身

Enemy中,添加一个新的全局变量

PhysicsCheck physicsCheck;

Awake()中,获取该组件

physicsCheck = GetComponent<PhysicsCheck>();

Update()中,添加判定代码

if (physicsCheck.touchLeftWall || physicsCheck.touchRightWall)
{
    transform.localScale = new Vector3(faceDirect.x, 1, 1);
}

只要判定碰撞到墙,则将Scale的X轴进行翻转

计时器延迟转身

Enemy中添加三个全局变量

[Header("计时器")]
public float waitingTime;
public float waitingTimeCounter;
public bool wait;

Awake()方法中,初始化waitingTimeCounter

waitingTimeCounter = waitingTime;

编写TimeCounter()方法,进行计时

public void TimeCounter()
{
    if(wait)
    {
        waitingTimeCounter -= Time.deltaTime;
        if(waitingTimeCounter < 0)
        {
            wait = false;
            waitingTimeCounter = waitingTime;
            transform.localScale = new Vector3(faceDirect.x, 1, 1);
        }
    }
}

改写Update()方法,并将walk的布尔值改为false,这样使得撞墙时,不播放走路动画

if ((physicsCheck.touchLeftWall && faceDirect.x < 0) || (physicsCheck.touchRightWall && faceDirect.x > 0))
{
    wait = true;
    animator.SetBool("walk",false);
}
TimeCounter();

解决野猪抽搐与未碰墙即转身的问题

Update()方法内的if语句只判定面朝方向的锚点

private void Update()
{
    // 实时方向
    faceDirect = new Vector3(-transform.localScale.x, 0, 0);
    if ((physicsCheck.touchLeftWall && faceDirect.x < 0) || (physicsCheck.touchRightWall && faceDirect.x > 0))
    {
        wait = true;
        animator.SetBool("walk",false);
    }
    TimeCounter();
}

标签:撞墙,Vector2,transform,physicsCheck,2D,Unity,判定,faceDirect,public
From: https://www.cnblogs.com/xinlindeyu/p/17926515.html

相关文章

  • Unity引擎2D游戏开发,野猪基本的移动逻辑和动画
    一、类的继承在Scripts下创建Enemy文件夹,里面再创建两个C#文件将Boar文件内的代码修改为以下代码,:后的是Enemy,即继承了Enemy类publicclassBoar:Enemy{}在Enemy内,编写基本属性publicclassEnemy:MonoBehaviour{[Header("基本参数")]//基本移动速度......
  • Unity3D UI帧动画详解
    nity3D是一款非常强大的游戏开发引擎,它提供了丰富的功能和工具,使开发者能够轻松创建各种类型的游戏。其中,UI(UserInterface)是游戏开发中非常重要的一部分,它用于展示游戏中的各种信息和交互元素。在Unity3D中,我们可以使用UI帧动画来创建各种炫酷的UI效果。本文将详细介绍Unity3D中U......
  • Unity3D 中正确调用CUDA程序详解
    Unity3D是一款强大的游戏开发引擎,可以实现各种各样的游戏效果。然而,在某些情况下,使用CPU来处理游戏中的复杂计算任务可能会导致性能瓶颈。为了解决这个问题,我们可以利用CUDA来使用GPU进行并行计算,从而提高游戏的性能。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的......
  • Unity3D UDP传输大文件怎么提高速度详解
    Unity3D是一款强大的游戏开发引擎,但是在处理大文件传输时,往往会遇到速度较慢的问题。本文将详细介绍如何通过使用UDP协议来提高大文件传输的速度,并给出相应的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的......
  • Unity获取用户输入
    Unity获取用户输入基本概念​unity​中使用Input.GetAxis()​或Input.GetAxisRaw()​接口来获得用户输入,这两个接口的返回值取值范围为[-1,1],具有以下特性:该值的含义取决于输入控制的类型,例如,对于游戏杆的水平轴,值为1表示游戏杆向右推到底,值为-1表示游戏杆向左推到底;值为......
  • 2d物理引擎学习 - 角运动
    角运动(AngularMotion)或叫转动(RotationalMotion)相关公式1) 瞬时角速度(angularvelocity):ω =Δ弧度/Δt,单位:弧度/秒,方向:逆时针旋转,沿转轴向上;顺时针旋转,沿转轴向下; 2)角加速度:a=(ω1-ω0)/t,单位:弧度/秒2,方向:同角速度方向 3) 线速度:即计算单位时间内走过......
  • Unity 刷新文本
    privatevoidrefreshContentSizeFitters(){//获取contentParent下的所有ContentSizeFitter组件ContentSizeFitter[]contentSizeFitters=gameObject.GetComponentsInChildren<ContentSizeFitter>();for(inti=0;i<contentSize......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发
    https://www.cnblogs.com/wuhuacong/tag/WPF/ 在我们的SqlSugar的开发框架中,整合了Winform端、Vue3+ElementPlus的前端、以及基于UniApp+Vue+ThorUI的移动前端几个前端处理,基本上覆盖了我们日常的应用模式了,本篇随笔进一步介绍前端应用的领域,研究集成WPF的应用端,循序渐进介绍基......
  • [WPF] 使用 MVVM Toolkit 构建 MVVM 程序(CommunityToolkit.Mvvm)
    1.什么是MVVMToolkit模型-视图-视图模型(MVVM)是用于解耦UI代码和非UI代码的UI体系结构设计模式。借助MVVM,可以在XAML中以声明方式定义UI,并使用数据绑定标记将UI链接到包含数据和命令的其他层。微软虽然提出了MVVM,但又没有提供一个官方的MVVM库(多年前有过......
  • 最大工作频率为32MHz,R7F100GPL2DFA、R7F100GPL3CFA低功耗MCU,10M08SAU169C8GGB MAX® 1
    一、RL78/G23 新一代RL78微控制器,最大工作频率为32MHz,外围功能得到进一步扩展,低功耗性能也有所提升。RL78/G23微控制器是RL78系列的新一代产品,CPU工作时的功耗为41μA/MHz,STOP(保持4KBSRAM)时的功耗为210nA,其低功耗在业内首屈一指。此外,由于采用SNOOZE模式定序器,它还能大幅度减少......