基本上,我正在尝试制作像 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 摄影机。
感谢任何帮助!