我正在尝试使用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;
}
}
提前感谢您的帮助。
据我所知,您总是在 Update() 方法中为您的对象设置相同的旋转。这就是物体不动的原因。
所以你至少有两个选择:
基于Morion已经尝试解释的内容
目前你很难根据输入设置旋转。
只要轴保持相同的值(例如键盘
0
或1
),旋转就会根据您的值硬捕捉到0
或25
。
你更想做的是从current rotation和adding开始旋转你的对象!
您可以使用例如
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);