简体   繁体   English

如何在 Unity 中锁定玩家的轮换?

[英]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:有两种方法可以帮助您:

  1. Just freeze the rotation from the inspector:只需冻结检查员的轮换:

在此处输入图像描述

  1. you can use some LookAt function (there is one for 3D but you can look and find ones for 2D) and just look at the camera.您可以使用一些 LookAt function(有一个用于 3D,但您可以查看并找到用于 2D 的)然后看看相机。

(if you cant find it let me know and I will add it) (如果找不到请告诉我,我会添加)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM