所以我正在尝试制作一款 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);
}
}
最佳答案
这可能是最简单的解决方案:
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。它可以影响以后的事情
这是一条高级信息,可能更符合您的需要。请也试试这个!
目前你有一个矢量,它是指向物体的 Nose 。
假设它正在向北移动,好吗?
所以,transform.forward指向北方,但指向“向下一点”。
虽然它指向北方,但如果您从侧面看它,矢量指向下方一点。
您真正想要的是那个矢量,但它是平的,而不是指向下方或上方。对吧?!
事实上,这是做到这一点的魔法:
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”完全没有关系。
关于c# - 让 GameObject 悬停在飞机上方? - Unity3D C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973229/