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

问题描述 投票:0回答:2

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

我的设计真的很基础:

我选择按照文档here中的建议为我的设计使用“关节”。

当我按下播放按钮时,手臂会掉落并在重力作用下弹回:这很难看,但目前我不关心这个。

我想做的是使用键盘上的按钮控制发音角度

我在“手臂”上添加了一个脚本,试图围绕肩关节向上移动手臂。

好吧,如果我问:那是因为它不起作用。

我试图编辑

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

提前感谢您的帮助。

c# unity3d
2个回答
1
投票

据我所知,您总是在 Update() 方法中为您的对象设置相同的旋转。这就是物体不动的原因。

所以你至少有两个选择:

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

0
投票

基于Morion已经尝试解释的内容

目前你很难根据输入设置旋转。

只要轴保持相同的值(例如键盘

0
1
),旋转就会根据您的值硬捕捉到
0
25

你更想做的是从current rotationadding开始旋转你的对象!

您可以使用例如

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);
© www.soinside.com 2019 - 2024. All rights reserved.