[英]How can I lock the rotation of a player in Unity?
I'm currently making a 2D game as a beginner and I made a spinning platform.我目前正在以初学者的身份制作 2D 游戏,并制作了一个旋转平台。 But when it's rotating the player's rotation (z-axis) also changes because it's a child of the platform.但是当它旋转时,玩家的旋转(z 轴)也会发生变化,因为它是平台的子级。 I need this when I use moving platforms.当我使用移动平台时,我需要这个。 Now I want to lock the z-axis of the rotation of the player.现在我想锁定播放器旋转的 z 轴。 I already tried it in 3 different ways, but none of them seems to be working.我已经尝试了 3 种不同的方法,但似乎没有一种方法有效。 Does anybody know how to do this?有人知道怎么做这个吗?
These are the three ways I tried:这是我尝试的三种方法:
// 1
PlayerTrans.transform.Rotate(
PlayerTrans.transform.rotation.x,
PlayerTrans.transform.rotation.y,
0);
// 2
PlayerTrans.transform.Rotate(
PlayerTrans.transform.rotation.x,
PlayerTrans.transform.rotation.y,
0,
Space.Self);
// 3
PlayerTrans.transform.localRotation = Quaternion.Euler(new Vector3(
PlayerTrans.transform.localEulerAngles.x,
PlayerTrans.transform.localEulerAngles.y,
0f));
and this is, what my code looks like for staying on the moving platforms.这就是我的代码留在移动平台上的样子。 I used raycasting for this:我为此使用了光线投射:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Raycasting : MonoBehaviour
{
// Start is called before the first frame update
Transform PlayerTrans;
public float RayCastRange = 3;
void Start()
{
PlayerTrans = transform.parent;
}
// Update is called once per frame
void Update()
{
RaycastHit2D PlattformCheck = Physics2D.Raycast(transform.position, -Vector2.up, RayCastRange);
if (PlattformCheck.collider != null)
{
if (PlattformCheck.collider.gameObject.tag == "Platform")
{
PlayerTrans.transform.SetParent(PlattformCheck.collider.gameObject.transform);
}
else
{
PlayerTrans.transform.SetParent(null);
}
}
else
{
PlayerTrans.transform.SetParent(null);
}
}
}
You should raycast directly down and then apply velocities to both objects (un-child the player from the platforms).您应该直接向下投射光线,然后将速度应用于两个对象(将玩家从平台取消子代)。 You could do something like this for the player:你可以为玩家做这样的事情:
public LayerMask mask; //set ‘mask’ to the mask of the
//platform in the Unity Editor.
public Vector3 velocity;
void Update()
{
RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit, 0.1f, mask))
//0.1f is the distance to the platform to be able to be moved by the platform.
{
velocity = hit.collider.gameObject.GetComponent<Platform>().velocity;
}
float h = Input.GetAxis(“Horizontal”);
//this one is for CharacterController:
cc.Move(velocity);
//this one is for rigidbody:
rb.velocity = velocity;
velocity = 0;
}
It takes the velocity from the 'Platform' script and moves the player based on it.它从“平台”脚本中获取速度并根据它移动玩家。 Now we should add the platform script.现在我们应该添加平台脚本。 Call it 'Platform'.称之为“平台”。
public Vector3 velocity;
public Vector3 a; //a and b are the two points you want the platform to go between.
public Vector3 b;
public float period = 2f; //the amount of seconds per cycle.
float cycles;
void Update()
{
cycles = Time.time / period;
float amplitude = Mathf.Sin(Mathf.PI * 2f * cycles);
Vector3 location = Vector3.Lerp(a, b, amplitude);
velocity = transform.position - location;
transform.position = velocity;
}
This script interpolates between the point a and b, then it finds the velocity and applies it.该脚本在点 a 和 b 之间进行插值,然后找到速度并应用它。 The player takes this velocity and it moves the player.玩家采用这个速度并移动玩家。 Comment if you found an error.如果发现错误,请发表评论。
There are 2 ways that might help you:有两种方法可以帮助您:
(if you cant find it let me know and I will add it) (如果找不到请告诉我,我会添加)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.