问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity3D开发中角色穿墙问题的解决方案

创作时间:
作者:
@小白创作中心

Unity3D开发中角色穿墙问题的解决方案

引用
CSDN
1.
https://blog.csdn.net/2302_80259386/article/details/146205458

在使用Unity3D开发游戏时,角色穿墙是一个常见的问题。本文将从代码实现、碰撞体设置和层级关系等多个角度,详细分析并解决这一问题。

在使用角色控制器实现角色移动时,如果在场景中创建了Cube作为墙进行测试,但发现角色仍然能穿墙而过,可以参考以下解决方案:

这是代码实现:

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

public class PlayerC : MonoBehaviour
{
    public float moveSpeed = 1;
    public CharacterController cc;

    // Start is called before the first frame update
    void Start()
    {
        cc = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");
        Debug.Log("x:" + x + "y:" + y);
        Vector3 dir = new Vector3(x, 0, y);
        dir = dir.normalized;

        // 修改坐标方式完成角色移动
        // this.transform.position += dir * moveSpeed * Time.deltaTime; 

        // 角色控制器方式完成角色移动
        cc.Move(dir * moveSpeed * Time.deltaTime);
    }
}

可能的原因及解决方案

  1. Cube的碰撞体设置问题
  • Cube缺少碰撞体:确保Cube上添加了BoxCollider组件。默认情况下,Unity的Cube会自动添加BoxCollider,但如果手动删除了该组件,角色就会直接穿过。
  • 碰撞体设置为触发器:如果Cube的BoxCollider的Is Trigger属性被勾选,那么它将不再作为物理碰撞体,而只会触发事件。

解决方法
确保Cube上有BoxCollider组件,并且Is Trigger属性未被勾选。如果Cube的碰撞体设置正确,但仍然穿墙,可以尝试重新添加BoxCollider。


  1. 检查物体的层级关系

在Unity中,物体的层级关系会影响碰撞检测。要确保角色和墙所在的层级之间没有被设置为忽略碰撞。

可以通过以下步骤检查和调整:

  • 在Unity编辑器中,选择角色和墙,检查它们的Layer属性。
  • 在Project Settings中,打开Physics设置,检查Layer Collision Matrix,确保角色和墙所在的层级之间启用了碰撞检测。如果未启用,勾选相应的格子以启用碰撞检测。

假设你的角色和墙都在默认层级(Default,层级0),那么你需要确保Default层级和自身的碰撞检测是启用的。具体来说:找到Layer Collision Matrix中Default层级对应的行和列,确保这两个格子被勾选。

如果角色和墙不在同一个层级,比如角色在Player层级,墙在Wall层级,那么你需要确保Player层级和Wall层级之间的碰撞检测是启用的。具体来说:找到Player层级对应的行和Wall层级对应的列。确保这个格子被勾选。

比如,假设角色在Player层级,墙在Wall层级:

  • 在Layer Collision Matrix中,找到Player层级对应的行。
  • 找到Wall层级对应的列。
  • 确保这个格子被勾选。

移动方法的选择

通过角色控制器的方法实现角色移动可以达到让角色不能穿墙的效果:

// 角色控制器方式完成角色移动
cc.Move(dir * moveSpeed * Time.deltaTime);

而使用更改坐标方式不能实现角色被墙阻隔而不能穿墙的效果:

// 修改坐标方式完成角色移动
this.transform.position += dir * moveSpeed * Time.deltaTime;

另外,在这里,角色控制器的方法若使用“SimpleMove”会更好:

// 1.不用×Time.deltaTime
// 2.有重力
cc.SimpleMove(dir * moveSpeed);

通过以上分析和解决方案,可以有效地解决Unity3D开发中常见的角色穿墙问题。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号