Unity3D:结合 FPS 控制器和陀螺仪相机的问题
Posted
技术标签:
【中文标题】Unity3D:结合 FPS 控制器和陀螺仪相机的问题【英文标题】:Unity3D: Issues on combining FPS Controller and gyroscope camera 【发布时间】:2016-04-24 19:08:29 【问题描述】:所以我正在尝试使用 Unity 5 FPS 控制器做一些不同的事情,并将我从这里 (http://forum.unity3d.com/threads/sharing-gyroscope-camera-script-ios-tested.241825/) 获得的陀螺仪相机脚本附加到 FirstPersonCharacter 相机(在注释掉 FirstPersonController 中所有与 mouselook 相关的代码之后) 。CS)。到目前为止,FirstPersonCharacter 根据手机的动作四处张望,但当玩家开始移动时会出现问题。
玩家(FPSController)和相机(FirstPersonCharacter)的移动是断开的,玩家移动和扫射与FirstPersonCharacter的变换无关。这是因为只有 FirstPersonCharacter 的变换受陀螺控制,而不是 FPSController。
我尝试通过依次向 FirstPersonController.cs 添加控件来进行修复,其中 FPSController 仅沿 y 轴旋转,这有效,但仅适用于父 FPSController。当 FPSController 转动时,它会搞砸 FirstPersonCharacter,导致它在直视时滚动,在向上或向下看时偏航,在向一侧看时俯仰。
我希望改变父母会影响孩子的行为,确实如此,但只是以一种可怕的方式。任何人都有解决此问题的解决方案或想法?
【问题讨论】:
从这里看起来像是一个本地/世界旋转问题。您能否提供一些代码并描述您在场景中的层次结构? FirstPersonController.cs 的代码是您从 Unity 的标准资产中获得的未经编辑的副本,除了添加了几个函数以允许转动播放器。至于我的对象的层次结构,FPSController 是 FirstPersonCharacter 的父级,它只沿 y 轴旋转。然而,由于陀螺运动的性质,FirstPersonCharacter 沿每个轴旋转。 另外,我忘了提到相机怪异只有当我将上述陀螺仪相机脚本中的transform.rotation = Input.gyro.attitude;
更改为:transform.localRotation = Input.gyro.attitude;
当使用 transform.rotation 时,相机似乎试图与玩家一起转动,但陀螺仪控件似乎覆盖了它试图做的任何旋转变化,并将其重置为初始旋转.喜欢。当身体转动时,头部一直向下并沿着同一轴线向下看。所以我使用 localRotaton 希望它会考虑父对象的旋转,但这只会让事情变得更糟。
【参考方案1】:
对于我的播放器控制器,我总是使用以下代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class SC_FPSController : MonoBehaviour
public float walkingSpeed = 7.5f;
public float runningSpeed = 11.5f;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;
public Camera playerCamera;
public float lookSpeed = 2.0f;
public float lookXLimit = 45.0f;
CharacterController characterController;
Vector3 moveDirection = Vector3.zero;
float rotationX = 0;
[HideInInspector]
public bool canMove = true;
void Start()
characterController = GetComponent<CharacterController>();
// Lock cursor
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
void Update()
// We are grounded, so recalculate move direction based on axes
Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 right = transform.TransformDirection(Vector3.right);
// Press Left Shift to run
bool isRunning = Input.GetKey(KeyCode.LeftShift);
float curSpeedX = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Horizontal") : 0;
float movementDirectionY = moveDirection.y;
moveDirection = (forward * curSpeedX) + (right * curSpeedY);
if (Input.GetButton("Jump") && canMove && characterController.isGrounded)
moveDirection.y = jumpSpeed;
else
moveDirection.y = movementDirectionY;
// Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
// when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
// as an acceleration (ms^-2)
if (!characterController.isGrounded)
moveDirection.y -= gravity * Time.deltaTime;
// Move the controller
characterController.Move(moveDirection * Time.deltaTime);
// Player and Camera rotation
if (canMove)
rotationX += -Input.GetAxis("Mouse Y") * lookSpeed;
rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * lookSpeed, 0);
如果你想用播放器移动相机,你必须把相机作为播放器的子文件夹。
希望能帮到你!
【讨论】:
以上是关于Unity3D:结合 FPS 控制器和陀螺仪相机的问题的主要内容,如果未能解决你的问题,请参考以下文章
unity实用技能unity3d 陀螺仪控制camera移动旋转