我已在我的Unity项目中设置了google vr sdk,它可以完美地移动相机。但是我如何使用vr方向控制播放器呢? 例如,当我向左或向右转头时,玩家向左或向右移动。
在我的代码中,我只知道从键盘输入:
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, moveVertical + motion_cont.getVertical(), 1f);
rb.velocity = movement * motion_cont.getSpeed();
答案 0 :(得分:0)
这是我经常使用的脚本,可以朝着相机的方向移动播放器。它使用纸板磁铁按钮触发行走。您可以将其更改为您想要的任何内容。
// This script moves your player automatically in the direction he is looking at. You can
// activate the autowalk function by pull the cardboard trigger, by define a threshold angle
// or combine both by selecting both of these options.
// The threshold is an value in degree between 0° and 90°. So for example the threshold is
// 30°, the player will move when he is looking 31° down to the bottom and he will not move
// when the player is looking 29° down to the bottom. This script can easally be configured
// in the Unity Inspector.Attach this Script to your CardboardMain-GameObject. If you
// haven't the Cardboard Unity SDK, download it from https://developers.google.com/cardboard/unity/download
using UnityEngine;
using System.Collections;
public class Autowalk : MonoBehaviour
{
private const int RIGHT_ANGLE = 90;
// This variable determinates if the player will move or not
private bool isWalking = false;
CardboardHead head = null;
//This is the variable for the player speed
[Tooltip("With this speed the player will move.")]
public float speed;
[Tooltip("Activate this checkbox if the player shall move when the Cardboard trigger is pulled.")]
public bool walkWhenTriggered;
[Tooltip("Activate this checkbox if the player shall move when he looks below the threshold.")]
public bool walkWhenLookDown;
[Tooltip("This has to be an angle from 0° to 90°")]
public double thresholdAngle;
[Tooltip("Activate this Checkbox if you want to freeze the y-coordiante for the player. " +
"For example in the case of you have no collider attached to your CardboardMain-GameObject" +
"and you want to stay in a fixed level.")]
public bool freezeYPosition;
[Tooltip("This is the fixed y-coordinate.")]
public float yOffset;
void Start ()
{
head = Camera.main.GetComponent<StereoController>().Head;
}
void Update ()
{
// Walk when the Cardboard Trigger is used
if (walkWhenTriggered && !walkWhenLookDown && !isWalking && Cardboard.SDK.Triggered)
{
isWalking = true;
}
else if (walkWhenTriggered && !walkWhenLookDown && isWalking && Cardboard.SDK.Triggered)
{
isWalking = false;
}
// Walk when player looks below the threshold angle
if (walkWhenLookDown && !walkWhenTriggered && !isWalking &&
head.transform.eulerAngles.x >= thresholdAngle &&
head.transform.eulerAngles.x <= RIGHT_ANGLE)
{
isWalking = true;
}
else if (walkWhenLookDown && !walkWhenTriggered && isWalking &&
(head.transform.eulerAngles.x <= thresholdAngle ||
head.transform.eulerAngles.x >= RIGHT_ANGLE))
{
isWalking = false;
}
// Walk when the Cardboard trigger is used and the player looks down below the threshold angle
if (walkWhenLookDown && walkWhenTriggered && !isWalking &&
head.transform.eulerAngles.x >= thresholdAngle &&
Cardboard.SDK.Triggered &&
head.transform.eulerAngles.x <= RIGHT_ANGLE)
{
isWalking = true;
}
else if (walkWhenLookDown && walkWhenTriggered && isWalking &&
head.transform.eulerAngles.x >= thresholdAngle &&
(Cardboard.SDK.Triggered ||
head.transform.eulerAngles.x >= RIGHT_ANGLE))
{
isWalking = false;
}
if (isWalking)
{
Vector3 direction = new Vector3(head.transform.forward.x, 0, head.transform.forward.z).normalized * speed * Time.deltaTime;
Quaternion rotation = Quaternion.Euler(new Vector3(0, -transform.rotation.eulerAngles.y, 0));
transform.Translate(rotation * direction);
}
if(freezeYPosition)
{
transform.position = new Vector3(transform.position.x, yOffset, transform.position.z);
}
}
}