素材巴巴 > 程序开发 >

Unity 2D 碰撞卡死 移动卡死

程序开发 2023-09-03 20:07:35

人物卡死的问题有很多, 目前笔者遇到的解决方案有 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 valuesprivate float ver, hor;//Animation componentsprivate Animator ani;private float nu;// Start is called before the first frame updatevoid Awake(){//Removing movePoint from the playermovePoint.parent = null;//Get the animation component of the first child objectani = transform.GetChild(0).GetComponent();        }private void Start(){}// Update is called once per framevoid 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;}}
 }

标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。