Я пишу 2D-платформер в Unity, и я пытаюсь заставить игрока оставаться на движущейся платформе. Сейчас я искал и переделывал день или два, и мне не повезло.Пребывание на движущихся платформах
В принципе, мне сказали, чтобы я старался, чтобы персонаж двигался с платформой, когда они касаются друг друга. Во-первых, если я использую что-либо, связанное с 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);
EDIT: Я думаю, что это, возможно, придется делать с тем, как я m определяя игрока и платформу, но я пробовал разные комбинации. Если платформа является триггером (на коллайдере), игрок проходит последовательно. Если нет, я не могу использовать функции OnTrigger. У меня есть жесткий диск, прикрепленный как к игроку, так и к платформе, но, похоже, это ничего не влияет. Когда игрок находится на платформе в некоторых настройках, он дрожит и часто просто падает.
Я никогда не использовал Unity3D, но это можно сделать что-то вроде 'moveDirection + = theplatform.moveDirection', когда персонаж находится на платформе? – mbeckish
Я пробовал это, но у меня, похоже, возникают проблемы с функциями OnTrigger и OnCollision, которые будут отвечать за часть «когда игрок находится на платформе». Я думаю, что это связано с тем, как я определяю свои объекты, но я не уверен, как правильно их определить, чтобы это могло работать. – muttley91
Кроме того, вам необходимо убедиться, что движок moveDirection.y не меньше, чем moveDirection.y вашей платформы, иначе вы бы провалились (если только инфраструктура Unity3D не будет автоматически обрабатывать это для вас автоматически) – mbeckish