C# 如何在下一个楼梯中间将球员降落
我正在Unity开发一款3D游戏,比如“Ketchapp楼梯”。 我使用“transform.Translate”向后移动楼梯,而不是向前移动球员,我让球员(球)在落地时跳跃。 玩家只能在X轴、Y轴上移动,我已经冻结了玩家的Z坐标,因此它不能通过撞击楼梯边缘向前或向后移动。每当运动员落地时,它就会向后跳。 问题在于球员的落地。 我希望玩家在下一个楼梯的中央着陆,而不管它在X轴上的位置。所以它看起来就像是一次跳跃一个楼梯的距离 这是楼梯脚本C# 如何在下一个楼梯中间将球员降落,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,我正在Unity开发一款3D游戏,比如“Ketchapp楼梯”。 我使用“transform.Translate”向后移动楼梯,而不是向前移动球员,我让球员(球)在落地时跳跃。 玩家只能在X轴、Y轴上移动,我已经冻结了玩家的Z坐标,因此它不能通过撞击楼梯边缘向前或向后移动。每当运动员落地时,它就会向后跳。 问题在于球员的落地。 我希望玩家在下一个楼梯的中央着陆,而不管它在X轴上的位置。所以它看起来就像是一次跳跃一个楼梯的距离 这是楼梯脚本 public class Stairmovement :
public class Stairmovement : MonoBehaviour {
public float speed;
Vector3 destroyPos;
private void Start()
{
destroyPos = new Vector3(0, -0.5f, -2f);
}
// Update is called once per frame
void Update () {
transform.Translate(new Vector3(0, -0.5f, -2f) * Time.deltaTime * speed);
if(transform.position.z <= destroyPos.z)
{
//transform.position = new Vector3(0, 4f, 16);
transform.position = new Vector3(0, transform.position.y + 4.5f, transform.position.z + 18f);
}
}
公共类楼梯移动:单行为{
公众浮标速度;
向量3;
私有void Start()
{
destroyPos=新矢量3(0,-0.5f,-2f);
}
//每帧调用一次更新
无效更新(){
transform.Translate(新矢量3(0,-0.5f,-2f)*Time.deltaTime*速度);
if(变换位置z 1f)
{
myRigidbody.velocity+=Vector3.up*物理.重力.y*(fallMultiplier)*时间.deltaTime;
}
}
专用void OnCollisionEnter(碰撞其他)
{
if(other.transform.tag==“接地”)
{
Debug.Log(“接地”);
接地=正确;
}
}
}
我需要你们的帮助,我希望你们能理解这个问题,如果不能,请告诉我。我会尽量解释得更好。谢谢你的帮助,我将不胜感激
这是一张显示跳跃位置和着陆位置之间差异的图像。[注意:请记住我正在移动楼梯。]
![图像]:这个想法是你需要利用楼梯的向后移动速度,这样在球在空中的时间内,每一个楼梯只移动“1个楼梯长度”。因此,假设每个楼梯的移动需要1秒,那么球也应该在空中1秒,然后落在楼梯上。谢谢你的回答。我已经试过了,当我给楼梯的速度值为0.9575时,它会给出期望的结果,但我想提高游戏速度,例如,当玩家达到100分时,移动速度会增加,这将使其回到着陆问题。有没有办法减少球员的空中时间?是的,你可以降低跳跃速度或增加下降倍增,或者两者兼而有之。
public class Player : MonoBehaviour {
private Rigidbody myRigidbody;
public bool grounded;
public float jumpSpeed;
public float forwardSpeed;
public float fallMultiplier;
// Use this for initialization
void Start () {
myRigidbody = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
if (grounded)
{
myRigidbody.velocity = new Vector3(myRigidbody.velocity.x, jumpSpeed, forwardSpeed);
grounded = false;
}
if (this.gameObject.transform.position.y > 1f)
{
myRigidbody.velocity += Vector3.up * Physics.gravity.y * (fallMultiplier) * Time.deltaTime;
}
}
private void OnCollisionEnter(Collision other)
{
if (other.transform.tag == "Ground")
{
Debug.Log("Grounded");
grounded = true;
}
}