我正在编写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专辑中添加了平台和播放器的规格:
答案 0 :(得分:0)
这在很大程度上取决于触发器盒的高度,但值得研究。在你的TriggerStay
中,你有一个关于玩家y坐标的IF声明。如果触发盒相当大并且平台的速度足够快,则在向上和更新时间之间,玩家Y坐标可以暂时小于触发器Y坐标。这会导致他失去亲子关系,只会稍后重新获得几分。这可能是“抖动”的原因。
答案 1 :(得分:0)
我遇到的问题
希望这有助于任何可能正在寻找答案的人!