Ich schreibe einen 2D Platformer in Unity und ich versuche, den Spieler auf einer beweglichen Plattform zu halten. Ich habe jetzt ein oder zwei Tage damit verbracht, zu suchen und zu basteln, und ich habe kein Glück.Bleiben Sie auf beweglichen Plattformen
Grundsätzlich wurde mir gesagt, ich solle versuchen, den Charakter mit der Plattform in Bewegung zu halten, wenn sie sich berühren. Erstens, wenn ich etwas verwende, das mit OnTriggerEnter() verwandt ist, geht der Spieler direkt durch die Plattform. Wenn ich OnCollisionEnter() (mit einem CharacterController auf dem Player und einem BoxCollider auf der Plattform) mache, passiert gar nichts. Dies sind zwei Dinge, die ich am häufigsten vorgeschlagen habe. Der andere Elternteil ist der Spieler mit der Plattform, aber dies verursacht scheinbar "Probleme" (häufig gesagt, nie erklärt).
Also, wie kann ich den Spieler auf der beweglichen Plattform bleiben? Hier ist der Code für die bewegliche Plattform:
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);
}
und hier ist der Code für die Bewegung des Spielers (in 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: Ich denke, es könnte mit dem zu tun hat, wie ich Ich definiere den Spieler und die Plattform, aber ich habe verschiedene Kombinationen ausprobiert. Wenn die Plattform ein Trigger ist (an ihrem Collider), durchläuft der Spieler sie durchgängig. Wenn nicht, kann ich keine OnTrigger-Funktionen verwenden. Ich habe einen starren Körper an den Player und die Plattform, aber es scheint nichts zu beeinflussen. Wenn der Spieler in einigen Setups auf die Plattform kommt, zittert er und fällt oft einfach durch.
Ich habe noch nie Unity3D verwendet, aber ist es möglich, so etwas wie 'moveDirection + = thePlatform zu tun.moveDirection "wenn sich der Charakter auf einer Plattform befindet? – mbeckish
Ich habe das versucht, aber ich habe Probleme mit den OnTrigger und OnCollision Funktionen, die für den "wenn Spieler auf der Plattform ist" Teil davon verantwortlich sein würde. Ich denke, es hat damit zu tun, wie ich meine Objekte definiere, aber ich bin mir nicht sicher, wie man sie so definieren soll, dass dies funktionieren kann. – muttley91
Außerdem müssen Sie sicherstellen, dass die moveDirection.y des Charakters niemals kleiner ist als die der moveDirection.y Ihrer Plattform, sonst würden Sie durchfallen (es sei denn, das Unity3D-Framework handhabt das automatisch für Sie?) – mbeckish