C# 团结可以';t在开始时生成对象进行地面检查
我有一个游戏,在游戏开始时生成一个迷宫。玩家从大约10英尺的高度被扔进迷宫。问题是,如果我单击播放器对象并将检查器从“正常”更改为“调试”,我会看到角色仍在不断生成下降速度。我在角色的底部有一个球体,应该进行地面检查,但显然不起作用。这是角色的一个地面平铺和地面检查功能的相关代码 脚本文件夹中GameManager.cs中的地面平铺代码C# 团结可以';t在开始时生成对象进行地面检查,c#,unity3d,C#,Unity3d,我有一个游戏,在游戏开始时生成一个迷宫。玩家从大约10英尺的高度被扔进迷宫。问题是,如果我单击播放器对象并将检查器从“正常”更改为“调试”,我会看到角色仍在不断生成下降速度。我在角色的底部有一个球体,应该进行地面检查,但显然不起作用。这是角色的一个地面平铺和地面检查功能的相关代码 脚本文件夹中GameManager.cs中的地面平铺代码 var tile = Instantiate(_tilePrefab); tile.transform.Rotate(90, 0, 0); tile.trans
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语句中,检查ifvelocity.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(isGrounded)
{
速度y=0f;
}
对于2:
加:
if(isGrounded)
{
速度y=0f;
}
其他的
{
速度.y+=重力*时间增量;
}
并删除:
controller.Move(move * speed * Time.deltaTime);
//removed this line «—-
controller.Move(velocity * Time.deltaTime);
不要介意我之前的评论。我发现了问题,现在正在写我的答案。我描述为“不太重要”的第二部分是可选的,可能会抛出错误。如果出现错误,请撤消第二部分。