当前位置: 首页 > news >正文

【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。

在这里插入图片描述

2.其次,检查物体的层级关系:

在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);

相关文章:

  • C# --- LINQ
  • 【鸿蒙】封装日志工具类 ohos.hilog打印日志
  • 3.6、数字签名
  • 模拟String基本函数/深浅拷贝/柔性数组
  • Redis 详解
  • Spring @Bean注解使用场景二
  • HOT100——链表篇Leetcode234. 回文链表
  • Harmony OS NEXT API 12核心API深度解析与开发实践
  • python基础
  • SQL Server的连接时发生了与网络相关或特定于实例的错误。未找到服务器或无法访问服务器
  • 软考教材重点内容 信息安全工程师 第19章 操作系统安全保护
  • 【JavaScript】10-深入面向对象
  • [设计模式]1_设计模式概览
  • NRBO-Transformer牛顿-拉夫逊算法优化编码器多变量时间序列预测(Matlab实现)
  • Maximize Rating
  • Git使用和原理(3)
  • 从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(2)消息队列与消息中间件
  • 2025-03-15 学习记录--C/C++-PTA 习题3-3 出租车计价
  • Thinkphp的belongsToMany(多对多) 和 hasManyThrough(远程一对多)的区别是什么?
  • 【蓝桥杯】省赛:连连看(暴力 非AC)
  • dede医院网站模板下载/seo黑帽技术有哪些
  • 网站建设教学廊坊/滨州网站seo
  • 微商城网站建设教程/软文代写接单平台
  • 一级a做爰片迅雷网站/网销平台排名
  • 怎么做网站收广告费/香港百度广告
  • 越秀区政府门户网站建设/网页设计培训学校