我整天都在努力解决我在学校项目中遇到的问题,所以我不得不采取最后的手段:stackoverflow!
我的问题: 我正在尝试相对于可以围绕角色旋转的相机旋转角色。
输入:xbox控制器
相关信息:
我遗漏了很多代码,只是为了让大家可读。如果您需要什么,请询问,我会提供。
我到目前为止所拥有的: https://imgur.com/TERUXV6
为什么出错:字符旋转是完美的。但是,我在这里作弊。相机根据世界坐标旋转。旋转相机后,这很明显。
以下脚本已附加到角色GameObject。
public class CharacterBehaviour : MonoBehaviour
{
public GameObject HumanoidModel;
[SerializeField]private Transform _mainCameraTransform;
private void Update()
{
ApplyMovement();
RotateCharacter();
}
private void ApplyMovement()
{
//get input movement vector
Vector3 inputMovement = new Vector3(_inputMoveCharacterXAxis, 0, _inputMoveCharacterZAxis);
//make sure camera forward is player movement forward
Vector3 mainCameraForwardXz = Vector3.Scale(_mainCameraTransform.forward, new Vector3(1, 0, 1)); //multiplied by (1, 0, 1) to remove Y component
Vector3 mainCameraRightXz = Vector3.Scale(_mainCameraTransform.right, new Vector3(1, 0, 1)); //multiplied by (1, 0, 1) to remove Y component
Vector3 movementInCameraForwardDirection = mainCameraForwardXz * inputMovement.z;
Vector3 movementInCameraRightDirection = mainCameraRightXz * inputMovement.x;
Vector3 movementForward = movementInCameraForwardDirection + movementInCameraRightDirection;
_velocity = movementForward * MaximumSpeed;
}
private void RotateCharacter()
{
Vector3 inputDirection = new Vector3(_inputMoveCharacterXAxis, 0, _inputMoveCharacterZAxis);
HumanoidModel.transform.LookAt(HumanoidModel.transform.position +
HumanoidModel.transform.forward + inputDirection);
}
以下脚本已附加到主相机GameObject
public class CameraBehaviour : MonoBehaviour
{
[SerializeField] private Transform _characterTransform;
[SerializeField] private Transform _mainCameraTransform;
private void Update ()
{
RotateCamera();
}
// Rotate camera horizontally
private void RotateCamera()
{
_mainCameraTransform.RotateAround(_characterTransform.position, Vector3.up, _inputRotateCameraHorizontal);
}
}
问题的根源在RotateCharacter()函数中。我知道我需要在那里进行一些计算,以使角色旋转相对于摄像机旋转,我只是无法弄清楚该计算是什么以及为什么。
谢谢!
Thrindil
答案 0 :(得分:0)
所以这就是您需要的...
camDefault,一个Vector3,用于char后面的摄像机初始位置。
camCur,用于摄像机当前位置的Vector3(以跟踪其在角色周围orbit
中的位置)
您需要将Awake()中的camDefault设置为当时的当前位置,即IE camDefault = cam.transform.position);
然后进行固定更新
camCur= cam.transform.position;
然后
if(Input//your horizontal axis here//==0){
if(camCur!=camDefault){
//translate camera to cam default
cam.tranform.translate(camDefault);
cam.lookat(player.transform.forward);
}
}
请记住,其中一些是伪代码,只是一个一般的方向。但是有统一的方法。如果实施得当,此脚本将允许您使用右摇杆旋转炭炉,然后放开时摄像机会向后滑动。
我相信,出于您的理智,将相机直接作为ybot的子代会更容易,因此它会随之旋转,因此您无需手动操作即可将相机始终留在玩家身后。但那只是我的个人意见。就目前而言,相机和模型都是播放器的子代,如果您希望相机随播放器一起旋转,只需使其成为该模型的子代即可。
在这种情况下,您可以像上面那样存储初始旋转和当前旋转,让我们的摇杆向左和向右看,然后在松开摇杆时向后弹回。