所以我正在尝试制作FPS型游戏,是否有可能将游戏对象锁定在Y轴上/无法向上或向下移动? GameObject是来自Counter Strike的AWP的模型,我使用WASD键在飞机上移动,当我使用鼠标向上/向下查看时,AWP对角线到我正在看的地方,而我不要那样。我的游戏看起来像这样:Screenshot
如果有帮助,这是我为AWP提供的代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class AWPscript : MonoBehaviour {
public float speed = 5f;
// public float sensitivityX = 15.0f;
// public float sensitivityY = 15.0f;
public Camera MainCamera;
public Camera scopeCamera;
public float lookSensitivity = 10f;
public float xRotation ;
public float yRotation ;
public float currentXRotation;
public float currentYRotation;
public float xRotationV;
public float yRotationV;
public GameObject Scopepng;
public float lookSmoothDamp = 0.1f;
public Image ScopePNG;
public AudioClip sound;
// Use this for initialization
void Start () {
speed = 7.5f;
}
// Update is called once per frame
void Update () {
if(Input.GetKey(KeyCode.W))
transform.Translate(Vector3.forward * Time.deltaTime*speed);
if (Input.GetKey(KeyCode.S))
transform.Translate(Vector3.back * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.A))
transform.Translate(Vector3.left * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.D))
transform.Translate(Vector3.right * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.LeftControl))
speed = 15f;
lookAround();
scope();
}
void scope()
{
if (Input.GetMouseButton(1))
{
MainCamera.enabled = false;
scopeCamera.enabled = true;
ScopePNG.enabled = true;
}
else
{
MainCamera.enabled = true;
scopeCamera.enabled = false;
ScopePNG.enabled = false;
}
}
void lookAround()
{
xRotation -= Input.GetAxis("Mouse Y") * lookSensitivity;
yRotation += Input.GetAxis("Mouse X") * lookSensitivity;
transform.rotation = Quaternion.Euler(xRotation, yRotation, 0);
}
}
答案 0 :(得分:2)
这可能是最简单的解决方案:
void Update () {
if(Input.GetKey(KeyCode.W))
transform.Translate(Vector3.forward * Time.deltaTime*speed);
if (Input.GetKey(KeyCode.S))
transform.Translate(Vector3.back * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.A))
transform.Translate(Vector3.left * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.D))
transform.Translate(Vector3.right * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.LeftControl))
speed = 15f;
LookAround();
Scope();
JoeFix();
}
public float fixedFloatingHeightMeters; // set to say 1.4 in the editor
private void JoeFix()
{
Vector3 p = transform.position;
p.y = fixedFloatingHeightMeters;
transform.position = p;
}
PS!你真的必须将lookAround重命名为LookAround并将范围重命名为Scope。它会影响以后的事情
这是一种可能更符合您需求的高级信息。请试一试!
目前你有一个向量是指向对象的鼻子。
说事情朝北,好吗?
所以,transform.forward指向北方,但它指向“下降位”。
虽然它指向北方,如果你从侧面看到它的向量指向DOWN A BIT。
你真正想要的是那个向量,但是FLAT,而不是指向下或向上。对不对?!
事实上,这就是魔术:
Vector3 correctDirectionButPossiblyDownOrUp = transform.forward;
Vector3 correctDirectionButFlatNoDownOrUp;
correctDirectionButFlatNoDownOrUp
= Vector3.ProjectOnPlane(
correctDirectionButPossiblyDownOrUp,
Vector3.up );
correctDirectionButFlatNoDownOrUp.Normalize();
correctDirectionButFlatNoDownOrUp 现在是您想要的“神奇”矢量。
但是,不要忘记Translate在LOCAL SPACE中工作。 (“对象”的世界观。)你非常想在世界空间中移动它,这很容易。注意最后一个参数:https://docs.unity3d.com/ScriptReference/Transform.Translate.html
transform.Translate(
correctDirectionButFlatNoDownOrUp * Time.deltaTime*speed,
Space.World);
就是这样!
脚注不要忘记“Vector3.up”与“Vector3”完全没有关系。
答案 1 :(得分:0)
如果您不需要重力,那么移除RigidBody组件将停止Unity施加重力并且它将悬停。