Unity 2D 碰撞卡死 移动卡死

人物卡死的问题有很多, 目前笔者遇到的解决方案有 trigger 勾选, 改变刚体 Collider, 增加不可移动代码三种.

1. 两个碰撞体间 trigger 勾选

一般而言, 刚体 Rigidbody 所在的 Box Collider 2D 的 trigger 不打勾(打不打勾看项目当时的需求和情况有所改变), 与之相撞的 BX2D 的 trigger 打勾

image-20220515135206206

但大部分项目这种肯定是做好的, 那么就有一种可能是人物底部方形和碰撞体方形重合, 于是有了接下来第二点

2. 改变刚体 Collider

我们可以把刚体底部(或者与碰撞体相撞的地方)设为原型碰撞 Circle Collider 2D

image-20220515135334132

如果这样也不行, 就有可能是刚体移动的代码是强制移动, 这时候我们可以给要被碰撞的物体加一个层级, 再在代码中加一个遇到不可移动的代码

3. 增加不可移动代码

新增层级 Unwalkable, 用了下方代码后在 WhatStopMovement 选择 Unwalkable

再把不想穿过的层级变为 Unwalkable, 就可以实现不卡死碰撞

image-20220515141433088

(这里是刚体的配置)

image-20220515141527387

(案例中把 Titl Palette 改为 StopWalkable, 就不会卡死在wall)

下方的代码移动是和项目的 player 移动相关, 我们是平面俯视移动(不是横版跳跃), 可以酌情参考

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

public class NewBehaviourScript : MonoBehaviour
{
    [Header("Movement Speed")]
    public float moveSpeed = 1f;
    [Header("Player movement points")]
    public Transform movePoint;
    [Header("Movement detection layer")]
    public LayerMask whatStopMovement;

    [SerializeField]
    private GameObject item;

    /// Virtual axis values
    private float ver, hor;
    //Animation components
    private Animator ani;
    private float nu;

    // Start is called before the first frame update
    void Awake()
    {
        //Removing movePoint from the player
        movePoint.parent = null;
        //Get the animation component of the first child object
        ani = transform.GetChild(0).GetComponent<Animator>();        
    }

    private void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        hor = Input.GetAxis("Horizontal");
        ver = Input.GetAxis("Vertical");
        transform.position = Vector3.MoveTowards(transform.position, movePoint.position, moveSpeed * Time.deltaTime);

        if (Vector3.Distance(transform.position, movePoint.position) <= .05f)
        {
            if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) == 1f)
            {
                if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(Input.GetAxisRaw("Horizontal"), 0f, 0f), .2f, whatStopMovement))
                {
                    movePoint.position += new Vector3(Input.GetAxisRaw("Horizontal"), 0f, 0f);
                    ani.SetTrigger("Move");
                    this.enabled = true;
                }

            }
            else if (Mathf.Abs(Input.GetAxisRaw("Vertical")) == 1f)
            {
                if (!Physics2D.OverlapCircle(movePoint.position + new Vector3(0f, Input.GetAxisRaw("Vertical"), 0f), .2f, whatStopMovement))
                {
                    movePoint.position += new Vector3(0f, Input.GetAxisRaw("Vertical"), 0f);
                    ani.SetTrigger("Move");
                    this.enabled = true;
                }
            }


        if (Vector3.Distance(transform.position, movePoint.position) >= 2f)
        {
            movePoint.position = GameObject.Find("player").transform.position;
        }

        }
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>