Jump to content
Unity Insider Forum

Als Spieler im Kreis laufen


Nutty

Recommended Posts

Hallo.

Ich habe bei meiner Kamera-/Spielersteuerung das Problem, dass man nicht wirklich im Kreis laufen kann.

Wenn es funktioniert, soll es ungefähr so wie bei The Legend of Zelda: Wind Waker oder vielen anderen Third Person Spielen aussehen, dass wenn man gerade nach links oder rechts läuft, man im Kreis um die Kamera läuft.

Momentan läuft der Spieler aber gerade nach links oder rechts.

Was ich schon probiert habe:

- Die Kamera ein Stück vor den Spieler rotieren, sodass der Spieler nachzieht. Funktioniert an sich auch, aber um den Laufkreis davon klein genug zu bekommen, muss ich die Kamera zu weit rotieren und der Spieler ist nicht mehr auf dem Bildschirm.

- Die Kamera ein Stück vor den Spieler rotieren und die Position entsprechend anzupassen. Dabei fliegt die Kamera einfach weg.

- Den Spieler weiter zu rotieren, als er müsste. Dabei läuft er dann einfach schief.

- Dem Spieler extra Velocity oder AddForce mitgeben, relativ zum Spieler nach links oder rechts. Dabei passiert einfach nichts.

 

Jetzt weiß ich leider nicht mehr weiter, was man noch probieren könnte, weshalb ich hoffe, dass ihr mir weiterhelfen könnt.

Hier mein Code:

Kamera-Script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMovementController : MonoBehaviour {

    CameraMovementData movementData;
    Vector3 velocity = Vector3.zero;

    private void Start()
    {
        movementData = new CameraMovementData();
    }

    private void Update()
    {
        movementData.CurrentX += Input.GetAxis("Mouse X") * movementData.Sensitivity;
        movementData.CurrentY += Input.GetAxis("Mouse Y") * -movementData.Sensitivity;
        movementData.CurrentY = Mathf.Clamp(movementData.CurrentY, movementData.MinY, movementData.MaxY);
    }

    private void LateUpdate()
    {
        Vector3 targetPosition = movementData.TargetTransform.position + Quaternion.Euler(movementData.CurrentY, movementData.CurrentX, 0) * new Vector3(0, 0, -movementData.MinDistance);
        transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, 0.1f);

        transform.LookAt(movementData.TargetTransform.position);
        
    }
}

Spieler-Script

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovementController : PlayerCommonController{

    PlayerMovementData movementData;

    private void Start()
    {
        movementData = new PlayerMovementData();
        movementData.DistanceToGround = GetComponent<Collider>().bounds.extents.y + movementData.GroundCheckSpacing;
    }

    private void Update()
    {
        movementData.IsGrounded = GroundCheck();

        if (movementData.IsGrounded && Input.GetButtonDown("Jump"))
        {
                movementData.VerticalVelocity = movementData.JumpPower;
        }
        else if (!movementData.IsGrounded && movementData.CanDoubleJump && Input.GetButtonDown("Jump"))
        {
            movementData.VerticalVelocity = movementData.JumpPower;
            movementData.CanDoubleJump = false;
        }
        else
            movementData.VerticalVelocity -= movementData.Gravity * Time.deltaTime;

        if (movementData.VerticalVelocity < 0 && movementData.IsGrounded)
        {
            movementData.VerticalVelocity = 0;
            movementData.CanDoubleJump = true;
        }
    }

    void FixedUpdate()
    {
        Vector3 forward = movementData.CameraObject.transform.forward;
        Vector3 right = movementData.CameraObject.transform.right;
        forward.y = 0f;

        Vector3 newDirection = (forward * movementData.InputZ) + (right * movementData.InputX);

        movementData.Movement = newDirection.normalized;
        newDirection.y = movementData.VerticalVelocity;
        movementData.Movement = new Vector3(movementData.Movement.x, newDirection.y, movementData.Movement.z);

        if (movementData.Movement.magnitude != 0)
            transform.rotation = Quaternion.LookRotation(transform.forward + new Vector3(movementData.Movement.x, 0, movementData.Movement.z) * movementData.SmoothRotation);
        
        movementData.PlayerRigid.velocity = movementData.Movement * movementData.MovementSpeed;


        //Icephysics V1.0
        //movementData.PlayerRigid.velocity = Vector3.Lerp(movementData.PlayerRigid.velocity, new Vector3(movementData.Movement.x * movementData.MovementSpeed * 10f, movementData.Movement.y * movementData.MovementSpeed * 10f, movementData.Movement.z * movementData.MovementSpeed * 10f), Time.deltaTime);
    }

    private bool GroundCheck()
    {
        return Physics.Raycast(transform.position, Vector3.down, movementData.DistanceToGround);
    }
}

 

Nutty

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habs gelöst bekommen!

Ich musste die Rotation um die y-Achse direkt anpassen. Und zwar nachdem überprüft wird, ob es gerade einen Input in die entsprechende Richtung gibt. Mein Kamera-Script sieht jetzt so aus:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMovementController : MonoBehaviour {

    CameraMovementData movementData;
    Vector3 velocity = Vector3.zero;

    private void Start()
    {
        movementData = new CameraMovementData();
    }

    private void Update()
    { 
        if (movementData.InputX != 0)
            movementData.CurrentX += movementData.InputX * movementData.walkingRadius;
        else
            movementData.CurrentX += Input.GetAxis("Mouse X") * movementData.Sensitivity;


        movementData.CurrentY += Input.GetAxis("Mouse Y") * -movementData.Sensitivity;
        movementData.CurrentY = Mathf.Clamp(movementData.CurrentY, movementData.MinY, movementData.MaxY);

        
    }

    private void LateUpdate()
    {
        Vector3 targetPosition = movementData.TargetTransform.position + Quaternion.Euler(movementData.CurrentY, movementData.CurrentX, 0) * new Vector3(0, 0, -movementData.MinDistance);
        transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, 0.1f);

        transform.LookAt(movementData.TargetTransform);        
    }
}

Wobei InputX der Input auf der Horizontalen Achse ist und walkingRadius die größe des Kreises angibt, die der Spieler läuft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...