如何让玩家的角色旋转回到中心/相机方向?

问题描述 投票:0回答:0

基本上,我正在尝试制作像 Crash Bandicoot 中的 Hog Wild 这样的关卡,但有所不同。 (https://www.youtube.com/watch?v=UGdmWxLqw9Y&t=13s&ab_channel=GarlandTheGreat)

我已经到了角色向前移动的地步,并且可以向左/向右移动。

但是,在运动中添加旋转后,我无法让角色回到“中心”或面向相机的方向。下面是角色代码

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

public class Level3Movement : MonoBehaviour
{
    [SerializeField]
    private float slideSpeed = 0f;

    [SerializeField]
    private float rotSpeed = 0f;

    [SerializeField]
    private float forwardSpeed = 0f;

    [SerializeField]
    private Transform cameraTransform;

    [SerializeField]
    private CharacterController charController;

    public float jumpSpeed;
    private float ogStepOffset;
    private float ySpeed;
  
    void Start()
    {
        charController = GetComponent<CharacterController>();
        ogStepOffset = charController.stepOffset;
        
    }

   
    void Update()
    {
        float sideInput = Input.GetAxis("Horizontal");
        float forwardInput = Input.GetAxis("Vertical");      
      
      
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 moveDir = new Vector3(0, 0, sideInput);
        float magnitude = Mathf.Clamp01(moveDir.magnitude) * slideSpeed;
        
        moveDir.Normalize();

       
        //Makes penguin move smoothly when descending slope
        ySpeed += Physics.gravity.y * Time.deltaTime;       
        Vector3 velocity = moveDir * magnitude;
        velocity = AdjustVelocityToSlope(velocity);
        velocity.y += ySpeed;
        charController.Move(velocity*Time.deltaTime);
        charController.SimpleMove(forward*forwardSpeed);     
           
        //Checks if isGrounded, jumping logic
        if (charController.isGrounded)
        {
            charController.stepOffset = ogStepOffset;
            ySpeed = -0.5f;

            if (Input.GetButtonDown("Jump"))
            {
                ySpeed = jumpSpeed;
            }
        }
        else
        {
            charController.stepOffset = 0;
        }

        //Rotates character towards direction
       if (moveDir != Vector3.zero)
        {
//Here I have tried to add an else statement that rotates the character to Vector.forward
//I've also tried cameraTransform.y

            Quaternion toRot = Quaternion.LookRotation(moveDir, Vector3.up);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, toRot, rotSpeed * Time.deltaTime);

        }

       


        moveDir = Quaternion.AngleAxis(cameraTransform.rotation.eulerAngles.y, Vector3.up)* moveDir;
    }
        


    

    //Character moves smoothly down the slope
    private  Vector3 AdjustVelocityToSlope(Vector3 velocity)
    {
        var ray = new Ray(transform.position, Vector3.down);

        if(Physics.Raycast(ray, out RaycastHit hitInfo, 0.5f))
        {
            var slopeRotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
            var adjustVelocity = slopeRotation * velocity;


            if(adjustVelocity.y < 0)
            {
                return adjustVelocity;
            }
        }

        return velocity;
    }

   
}



在这一点上,我们正在考虑使地图成为一条单轴上的直线,但如果我们能让它更具动态性,我们会更愿意。

使用 Cinemachine 摄影机。

感谢任何帮助!

c# unity3d
© www.soinside.com 2019 - 2024. All rights reserved.