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

Posted

技术标签:

【中文标题】如何在 Unity 中锁定玩家的轮换?【英文标题】:How can I lock the rotation of a player in Unity? 【发布时间】:2021-07-26 23:25:23 【问题描述】:

我目前正在以初学者的身份制作 2D 游戏,并且制作了一个旋转平台。但是当它旋转时,玩家的旋转(z 轴)也会发生变化,因为它是平台的子级。当我使用移动平台时,我需要这个。现在我想锁定播放器旋转的 z 轴。我已经尝试了 3 种不同的方法,但似乎没有一种方法有效。有人知道怎么做吗?

这是我尝试的三种方法:

// 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));

这就是我的代码留在移动平台上的样子。我为此使用了光线投射:

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);
        
    

【问题讨论】:

您可能只想通过光线投射检测玩家是否在平台上,然后访问对象的移动脚本。确保在运动脚本中有一个 Vector3 类型的速度变量。然后,您应该为播放器添加一个速度变量,并将速度设置为平台的速度。并将速度应用于两个对象。如果你愿意,我可以在脚本中发送代码。 不要让玩家成为平台的孩子!而是创建一个跟随平台移动的脚本,但不包含任何内容 @ken 是的,那太好了,非常感谢! @derHugo 有那么复杂吗? 你的播放器是刚体还是普通变换? 【参考方案1】:

有两种方法可以帮助您:

    只需冻结检查员的轮换即可:

    您可以使用一些 LookAt 功能(有一个用于 3D,但您可以查看并找到用于 2D 的功能)然后只看相机。

(如果找不到请告诉我,我会添加)

【讨论】:

【参考方案2】:

您应该直接向下投射光线,然后对两个对象应用速度(将玩家从平台取消子代)。你可以为播放器做这样的事情:

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;

它从“平台”脚本中获取速度并根据它移动玩家。现在我们应该添加平台脚本。称之为“平台”。

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;

此脚本在点 a 和 b 之间进行插值,然后找到速度并应用它。玩家采用这个速度并移动玩家。如果发现错误,请发表评论。

【讨论】:

以上是关于如何在 Unity 中锁定玩家的轮换?的主要内容,如果未能解决你的问题,请参考以下文章

Unity2D-当玩家被击中时如何在摧毁它们后恢复心

unity 3d 动画完成后如何让玩家停留在目标位置

如何在 Unity 中加载分数?

Unity-新增锁定输入如何操作?

unity - 两个具有刚体的物体如何相互穿过?

Unity 3d PhotonEngine 其他玩家如何获取masterclient生成的数据