移动平台大部分时间都可以工作,但偶尔会掉头和/或是紧张不安

时间:2013-03-28 03:31:14

标签: c# unity3d game-physics

我正在编写2D游戏,而我正试图让移动平台工作。在做了一些先前的调查之后,我几乎都在工作。我们的想法是拥有2个带有碰撞器的平台对象:1个是一个可见对象,另一个是设置了isTrigger的不可见对象(因为玩家只会通过一个触发器)。此处设置了Moving Platform子代码(触发器)的代码。

using UnityEngine;
using System.Collections;

public class MovingPlatformChild : MonoBehaviour
{
public string parentPlatform = "";

void Start ()
{
    transform.parent = GameObject.Find(parentPlatform).transform;
}

// Update is called once per frame
void Update ()
{

}

void OnTriggerEnter(Collider playerObject)
{
    Debug.Log ("enter moving platform");
    if(playerObject.gameObject.name.Contains("Player"))
    {
        playerObject.transform.parent = gameObject.transform;
    }
}
int i = 0;
void OnTriggerStay(Collider playerObject)
{
    Debug.Log ("stay" + i++);
    if(playerObject.transform.position.y >= transform.position.y)
    {
        playerObject.transform.parent = gameObject.transform;
    }
    else
    {
        playerObject.transform.parent=null;
    }
}
void OnTriggerExit(Collider playerObject)
{
    Debug.Log ("EXIT");
    if(playerObject.gameObject.name.Contains("Player"))
    {
        playerObject.transform.parent=null;
    }
}
}

Start()函数只是使它成为可见平台的子代。这可以在Unity编辑器中完成,而不是通过代码完成。

OnTriggerEnter函数将播放器对象添加为触发器平台对象的子级,触发器平台对象是可见平台的子级。所以他们都应该一起移动。

OnTriggerStay试图验证只有在玩家位于平台顶部时才能保持这种状态。当玩家处于触发器内时,如果玩家位于平台顶部,则它仍保持连接状态。否则,它不是。这样就不会在底端发生任何事情。

OnTriggerExit函数只会在玩家退出触发器时将其移除。

这有点奏效(但我们知道有些不够好)。它有时会起作用,但玩家会非常紧张。此外,在站在平台顶部的路上,TriggerStay功能似乎没有被调用(暗示玩家不再在触发器内)。通过我的Debug" stay"声明。最后,有时候玩家也会直接穿过平台。

此代码中的内容是什么允许玩家通过平台,或者在上升过程中如此紧张?我错过了一些关键的东西吗如果您需要更多代码,请告诉我们。

以下是非触发平台(触发平台的父级,位于相同位置)的移动代码。之后我还将分享播放器的更新功能。

void Start () 
{
    origY = transform.position.y;
    useSpeed = -directionSpeed;
}

// Update is called once per frame
void Update ()
{
    if(origY - transform.position.y > distance)
    {
        useSpeed = directionSpeed; //flip direction
    }
    else if(origY - transform.position.y < -distance)
    {
        useSpeed = -directionSpeed; //flip direction
    }
    transform.Translate(0,useSpeed*Time.deltaTime,0);
}

现在玩家代码:

  void Update()
{
    CharacterController controller = GetComponent<CharacterController>();
    float rotation = Input.GetAxis("Horizontal");
    if(controller.isGrounded)
    {
        moveDirection.Set(rotation, 0, 0); //moveDirection = new Vector3(rotation, 0, 0);
        moveDirection = transform.TransformDirection(moveDirection);

        //running code
        if(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) //check if shift is held
        { running = true; }
        else
        { running = false; }

        moveDirection *= running ? runningSpeed : walkingSpeed; //set speed

        //jump code
        if(Input.GetButtonDown("Jump"))
        {
            //moveDirection.y = jumpHeight;
            jump ();
        }
    }
    moveDirection.y -= gravity * Time.deltaTime;
    controller.Move(moveDirection * Time.deltaTime);
}
编辑:我已经在这张imgur专辑中添加了平台和播放器的规格:

http://imgur.com/a/IxgyS

2 个答案:

答案 0 :(得分:0)

这在很大程度上取决于触发器盒的高度,但值得研究。在你的TriggerStay中,你有一个关于玩家y坐标的IF声明。如果触发盒相当大并且平台的速度足够快,则在向上和更新时间之间,玩家Y坐标可以暂时小于触发器Y坐标。这会导致他失去亲子关系,只会稍后重新获得几分。这可能是“抖动”的原因。

答案 1 :(得分:0)

我遇到的问题

  1. 移动平台是使用Translate编写的。我使用刚体和rigidbody.Move函数重写了它。这没有立即帮助,但是......
  2. 我意识到我附加到播放器的CharacterMotor脚本(Unity提供了这个)包括移动平台支持。我将MovementTransfer值设置为PermaLocked,并且还取消选中脚本上的“Use FixedUpdate”框,现在它可以在99%的时间内工作。我曾经有过一段时间我做过某种特殊的行为而且已经滑过了,但是我无法再创造它。
  3. 希望这有助于任何可能正在寻找答案的人!