我正在学习unity和c#,并且希望使我的动作成为相对于相机的动作,而不是与世界相对的动作。我该怎么办?
我正在学习unity和c#,我的版本是2018.3.12f1。我很乐意提供帮助。
我只是想知道,我没有旋转凸轮,而是旋转播放器。
void Update()
{
float AxisY = Player.transform.eulerAngles.y;
/* Movement starts here */
Vector3 Movement = new Vector3 (Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) { //running code
Player.transform.position += Movement * running_speed * Time.deltaTime;
} else {
Player.transform.position += Movement * speed * Time.deltaTime;
}
/*Movement ends here */
/* Rotation controller starts here */
Quaternion target = Quaternion.Euler(Player.transform.eulerAngles.x, Player.transform.eulerAngles.y, Player.transform.eulerAngles.z);
/*if (Player.transform.eulerAngles.x != 0 || Player.transform.eulerAngles.z != 0 || Player.transform.eulerAngles.y != 0) {
Player.transform.rotation = Quaternion.Euler(0,0,0);
}*/
if (Input.GetKey(KeyCode.E))
{
Debug.Log("E got pressed");
//float AxisYPositive = Player.transform.eulerAngles.y;
AxisY = AxisY+1;
Player.transform.rotation = Quaternion.Euler(0, AxisY, 0);
} else if (Input.GetKey(KeyCode.Q))
{
Debug.Log("Q got pressed");
//float AxisYNegetive = Player.transform.eulerAngles.y;
AxisY=AxisY-1;
Player.transform.rotation = Quaternion.Euler(0, AxisY, 0);
}
}
}
玩家的动作与世界有关,如何使运动相机与世界有关?
答案 0 :(得分:0)
如果要相对于gameObject
进行移动,请在要旋转的Transform.Rotate()
的变换上调用方法gameObject
,而不要修改其Quaternion
直。只要确保将最后一个参数设置为Space.Self
。
if (Input.GetKey(KeyCode.E))
{
Debug.Log("E got pressed");
//float AxisYPositive = Player.transform.eulerAngles.y;
AxisY = AxisY+1;
Player.transform.Rotate(Quaternion.Euler(0, AxisY, 0), Space.Self);
}
答案 1 :(得分:0)
通常,您不想直接弄乱对象transform.rotation,至少不要,除非您至少对四元数有所了解(我不知道!)。
我可以看到您的代码存在一些问题,但是共同点似乎是您并不真正了解转换的工作原理。具体来说,您可能想研究世界/本地空间。
控制玩家的通常方法大致如下:
void DoMovement(Transform player)
{
//If you move first your controls might feel 'drifty', especially at low FPS.
Turn(player);
Move(player);
}
void Turn(Transform player)
{
float yaw = Input.GetAxis("Yaw") * time.deltaTime; //Aka turn left/right
player.Rotate(0, yaw, 0, Space.Self);
// Space.Self is the default value, but I put it here for clarity.
//That means the player will rotate relative to themselves,
//...instead of relative to the world-axis, like in your code.
}
您没有询问运动,但您的角色将始终相对于世界运动。下面应该使它相对于相机移动。
Transform _cameraTransform; //Assumes this is set druing Start()
void Move(Transform player)
{
var forwardMove = _cameraTransform.Forward; //Get whatever direction is 'forward' for camera
forwardMove.Y = 0; //Don't want movement up and down.
forwardMove = forwardMove.normalized; //Normalize sets the 'power' of the vector to 1.
//If you set Y to 0 and don't normalize you'll go slower when camera looks down
//...than when camera is flat along the plane
player.position += forwardMove * Input.GetAxis("Vertical") * time.deltaTime;
//Here you could do the same for strafe/side to side movement.
//Would be same as above, but using the transform.right and Horizontal axis
}
现在,我在这里做一些假设,因为您尚未指定游戏类型和所需的控件。我假设您有一个人物在一个几乎是平面的飞机上跑来跑去(没有飞机/飞船控件),并且相机已连接到播放器。事实并非如此。
无论如何,我建议您查看tutorials,尤其是我发现的滚球教程非常适合初学者,以帮助他们掌握与世界无关的基本玩家控件。如果您认为其他教程很有趣,那么它们也非常不错。
除了Unity官方提供的很多 ton 不错的教程之外,包括视频教程,因此对于类似的内容,您可以搜索<game type> tutorial
并选择看起来不错的东西给你。在开始使用时,我建议您避免使用最短的视频,因为仅适用于较长视频的说明可能会大大受益。当然,这并不意味着您也应该选择最长的视频。