我正在Unity中编写一个2D平台游戏,我想让玩家停留在移动平台上。我已经搜索和尝试了一两天,但没有什么进展。
基本上,我被告知要尝试保持角色与平台接触时一起移动。
首先,如果我使用任何与OnTriggerEnter()相关的内容,玩家将穿过平台。如果我使用OnCollisionEnter()(玩家有CharacterController,平台有BoxCollider),则根本没有反应。这是我发现的建议最多的两个方法。另一个方法是将玩家与平台进行父子关联,但这显然会引起“问题”(频繁提到,但从未解释)。
那么,我该如何让玩家停留在移动平台上?这是移动平台的代码:
public class MovingPlatform : MonoBehaviour
{
private float useSpeed;
public float directionSpeed = 9.0f;
float origY;
public float distance = 10.0f;
// Use this for initialization
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);
}
以下是玩家移动的代码(在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);
编辑:我认为这可能与我定义的玩家和平台有关,但我尝试了不同的组合。如果平台是一个触发器(在其碰撞器上),玩家会一直穿过它。如果不是,则无法使用OnTrigger函数。我在玩家和平台上都附加了刚体,但似乎没有影响任何东西。在某些设置中,当玩家确实上了平台时,他会抖动并经常掉落。
moveDirection += theplatform.moveDirection
这样做呢? - mbeckish