unity3d 如何从脚本和用户键盘移动发音

qq24tv8q  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(148)

我正在尝试使用Unity制作一个由键盘上的命令控制的“机器人手臂”。

我的设计非常简单:

我按照文档here中的建议选择在设计中使用“Articulations”。
当我按下播放按钮时,手臂会在重力的作用下下降并反弹:这是相当丑陋的,但这不是我目前关心的问题。
我想做的是**使用键盘上的按钮命令关节Angular **。
我在“手臂”上添加了一个脚本,尝试将手臂围绕肩关节向上移动。
如果我问:那是因为它不起作用。
我试着修改anchorRotation的值,但似乎没有任何效果。
我甚至还没有尝试编写捕获用户键盘按下的代码,因为显然我还不能通过编程移动发音。
我相信这可能是一些“统一概念”,我没有掌握有关的发音。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shoulder : MonoBehaviour
{
    public ArticulationBody shoulder;
    // Start is called before the first frame update
    void Start()
    {
        shoulder = GetComponent<ArticulationBody>();
    }

    // Update is called once per frame
    void Update()
    {
        float tiltAngle = -25.0f;
        // float smooth = 30.0f;
        float tiltAroundZ = Input.GetAxis("Horizontal") * tiltAngle;
        // float tiltAroundX = Input.GetAxis("Vertical") * tiltAngle;

        // Rotate the cube by converting the angles into a quaternion.
        Quaternion target = Quaternion.Euler(0, 0, tiltAroundZ);

        shoulder.anchorRotation = target;
    }
}

预先感谢你的帮助。

w7t8yxp5

w7t8yxp51#

据我所知,你总是在Update()方法中为你的对象设置相同的旋转,这就是为什么对象不移动的原因。
所以你至少有两个选择:

  • 使用transform.Rotate(实际上,我认为,它将足以完成您的任务)
  • 你可以计算不同的值每次更新(你需要存储对象的旋转的当前值,调整它的变化和应用它回来)
mwngjboj

mwngjboj2#

基于Morion已经尝试解释的内容
当前您正在基于输入硬设置旋转。
因此,只要轴保持相同的值(例如,对于键盘01),旋转将根据您的值硬捕捉到025
你更想做的是从当前旋转开始旋转你的对象,然后向它添加
您可以使用例如

soulder.anchorRotation *= Quaternion.Euler(0, 0, tiltAroundZ);

然而,这仍然旋转太快了

您将以25°每帧的速度旋转对象!
你更希望使用每秒旋转的速度

var tiltAroundZ = Input.GetAxis("Vertical") * tiltAngle * Time.deltaTime;

其中,Time.deltaTime是自上一帧以来经过的时间(秒),从而将值从value per frame转换为value per second
然后,如前所述,您可能会感兴趣的是,不直接应用旋转,但确实跟踪已经旋转的量,以便能够在以后夹紧它,例如。

// field at class level
private float tiltAroundZ;

...

tiltAroundZ += Input.GetAxis("Vertical") * tiltAngle * Time.deltaTime;
tiltAroundZ = Mathf.Clamp(tileAroundZ, minAngle, maxAngle);

shoulder.anchorRotation = Quaternion.Euler(0, 0, tiltAroundZ);

相关问题