C# 团结可以';t在开始时生成对象进行地面检查

C# 团结可以';t在开始时生成对象进行地面检查,c#,unity3d,C#,Unity3d,我有一个游戏,在游戏开始时生成一个迷宫。玩家从大约10英尺的高度被扔进迷宫。问题是,如果我单击播放器对象并将检查器从“正常”更改为“调试”,我会看到角色仍在不断生成下降速度。我在角色的底部有一个球体,应该进行地面检查,但显然不起作用。这是角色的一个地面平铺和地面检查功能的相关代码 脚本文件夹中GameManager.cs中的地面平铺代码 var tile = Instantiate(_tilePrefab); tile.transform.Rotate(90, 0, 0); tile.trans

我有一个游戏,在游戏开始时生成一个迷宫。玩家从大约10英尺的高度被扔进迷宫。问题是,如果我单击播放器对象并将检查器从“正常”更改为“调试”,我会看到角色仍在不断生成下降速度。我在角色的底部有一个球体,应该进行地面检查,但显然不起作用。这是角色的一个地面平铺和地面检查功能的相关代码

脚本文件夹中GameManager.cs中的地面平铺代码

var tile = Instantiate(_tilePrefab);
tile.transform.Rotate(90, 0, 0);
tile.transform.localPosition = new Vector3((x * tileWidth) + offsetTile, 0, (y * tileWidth) + offsetTile);
tile.gameObject.layer = LayerMask.NameToLayer("Ground");
tile.transform.parent = _mazePrefab;
脚本文件夹中的PlayerMovement.cs

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

public class PlayerMovement : MonoBehaviour
{
    public CharacterController controller;

    public float speed = 15f;
    public float gravity = -9.8f;

    public Transform groundCheck;
    public float groundDistance = 0.4f;
    public LayerMask groundMask;

    Vector3 velocity;
    bool isGrounded;

    // Update is called once per frame
    void Update()
    {
        isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);

        if (isGrounded && velocity.y > 0)
        {
            velocity.y = 0f;
        }

        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        Vector3 move = transform.right * x + transform.forward * z;

        controller.Move(move * speed * Time.deltaTime);

        velocity.y += gravity * Time.deltaTime;

        controller.Move(velocity * Time.deltaTime);
    }
}
我创建了一个地面层和所有东西,我有一个空的,在我的角色底部投影一个球体


我做错了什么?

问题一定是重力重置不起作用。我想你使用的是Brackeys的教程——我以前用过他的教程,所以我知道它是有效的。问题一定是你的重力重置了。所以,我检查了你的代码。我注意到有一个if语句,意思是在球员停飞时重置速度。因此,我检查
isGrounded
变量。唯一可能设置错误的是迷宫没有正确的图层。您的代码确实设置了正确的图层,因此我排除了该图层。然后我回顾一下if语句。唯一能引发它的是它的第二个术语:

if(…&&velocity.y>0)
请注意,在以后的代码中,速度是如何迅速降低的

velocity.y+=重力*Time.deltaTime;
注意重力是一个负变量

float重力=-9.8f;
Time.deltaTime
为正。将正值和负值相乘时,如果方程式中负值的数量为奇数,则结果为负值,如果为偶数,则结果为正值。因此,速度不是增加而是减小

在if语句中,检查if
velocity.y>0
,换言之:如果速度大于0,请执行某些操作。但根据数学计算,
速度总是在减小,而不是增大。但你要检测的是速度是否高于0,而不是低于0

将if语句更改为:

if(isGrounded&&velocity.y<0)
注意我如何将
更改为
0)/«-if语句。
{
速度y=0f;
}
float x=Input.GetAxis(“水平”);
float z=Input.GetAxis(“垂直”);
Vector3 move=transform.right*x+transform.forward*z;
控制器。移动(移动*速度*时间。延迟时间);
速度.y+=重力*时间.deltaTime;//«——改变速度。
...
因为在调用if语句之后,您可以更改它,所以不需要检测速度是否小于0。这是因为在每帧结束时,速度始终略小于0

在这里你可以做两件事

  • 可以删除if语句的第二部分
  • 您可以将速度更改添加到if语句的else中
  • 对于1:

    if(isGrounded)
    {
    速度y=0f;
    }
    
    对于2:

    加:

    if(isGrounded)
    {
    速度y=0f;
    }
    其他的
    {
    速度.y+=重力*时间增量;
    }
    
    并删除:

    controller.Move(move * speed * Time.deltaTime);
    
    //removed this line «—-
    
    controller.Move(velocity * Time.deltaTime);
    

    不要介意我之前的评论。我发现了问题,现在正在写我的答案。我描述为“不太重要”的第二部分是可选的,可能会抛出错误。如果出现错误,请撤消第二部分。