Sto scrivendo un Platform in 2D in Unity e sto cercando di far rimanere il giocatore su una piattaforma mobile. Ho cercato e armeggiato per un giorno o due adesso, e non ho avuto fortuna.Rimanere su piattaforme mobili
Fondamentalmente, mi è stato detto di provare a mantenere il personaggio in movimento con la piattaforma quando stanno toccando. In primo luogo, se utilizzo qualsiasi cosa correlata a OnTriggerEnter(), il lettore passa direttamente attraverso la piattaforma. Se faccio OnCollisionEnter() (con un CharacterController sul giocatore e un BoxCollider sulla piattaforma), non succede nulla. Queste sono due cose che ho trovato suggerite di più. L'altro è genitore del giocatore con la piattaforma, ma questo a quanto pare causa "problemi" (spesso affermato, mai spiegato).
Quindi, come posso far rimanere il giocatore sulla piattaforma mobile? Ecco il codice per la piattaforma mobile:
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);
}
E qui è il codice per il movimento del giocatore (in aggiornamento):
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: Penso che potrebbe avere a che fare con il modo in I' Sto definendo il giocatore e la piattaforma, ma ho provato diverse combinazioni. Se la piattaforma è un innesco (sul suo collisore), il giocatore lo attraversa in modo coerente. In caso contrario, non posso utilizzare le funzioni di OnTrigger. Ho un corpo rigido collegato sia al giocatore che alla piattaforma, ma non sembra influenzare nulla. Quando il giocatore sale sulla piattaforma in alcune situazioni, fa tremare e spesso finisce per cadere.
Non ho mai usato Unity3D, ma è possibile fare qualcosa di simile 'moveDirection + = thePlatform.moveDirection' quando il personaggio si trova su una piattaforma? – mbeckish
L'ho provato, ma mi sembra di imbattersi in problemi con le funzioni OnTrigger e OnCollision, che sarebbero responsabili della parte "quando il giocatore è sulla piattaforma". Penso che abbia a che fare con il modo in cui sto definendo i miei oggetti, ma non sono sicuro del modo corretto per definirli in modo che funzioni. – muttley91
Inoltre, dovrai assicurarti che moveDirection.y del personaggio non sia mai inferiore alla funzione moveDirection.y della tua piattaforma, altrimenti potresti fallire (a meno che il framework Unity3D lo gestisca automaticamente per te?) – mbeckish