我正在尝试为弹球桌制作柱塞。它基本上是一个带有刚体和弹簧接头的立方体。当按下一个特定的键时,我试图向spring的connectedAnchor添加一些z值以移动立方体,当不再按下该键时,connectedAnchor将返回其原始位置。
问题是connectedAnchor操作发生在worldspace中,并且由于我的表被旋转,沿z轴移动立方体是不正确的。基本上我正在寻找的是一种影响连接锚点的方法,但是使用立方体变换的局部轴而不是世界空间轴。
要获取原始的connectedAnchor,我会检查“自动配置”,然后在我进行操作之前取消选中它。 的统一文档说这应该有效,但事实并非如此。
Here's my script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlungerController : MonoBehaviour {
public float movement_increment_z;
public float max_movement_z;
private SpringJoint spring;
private Vector3 orig_anchor;
private void Start() {
spring = GetComponent<SpringJoint>();
if (!spring) { throw new System.Exception("spring joint is needed"); };
orig_anchor = spring.connectedAnchor;
}
public void processPlungerInput (bool isKeyPressed) {
Debug.Log(orig_anchor);
if (isKeyPressed) {
if (spring.connectedAnchor.z < max_movement_z) {
spring.connectedAnchor += new Vector3(0,0,movement_increment_z);
} else {
spring.connectedAnchor = orig_anchor;
}
}
}
}
除z轴运动外,刚体受到约束。
答案 0 :(得分:1)
我最终采取了略微不同的方法。我没有更改弹簧的连接锚,而是将其保持不变,并将连接的主体设置为静态定位的原点变换。
按下键时,我暂时将弹簧设置为0,然后更改柱塞对象的位置。未按下按键时,我将弹簧设置为较高值,以便弹回到定位点。
要处理约束问题,而不是使用刚体检查器上的选项(它只锁定世界空间轴上的位置),我使用了一个脚本,它将旋转和x / y位置设置为每帧的原始值。
脚本现在看起来像这样:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlungerController : MonoBehaviour {
public float movement_increment_z;
public float max_movement_z;
public float spring_power;
private SpringJoint spring;
private Vector3 orig_anchor;
private Quaternion orig_rotation;
private float orig_pos_x, orig_pos_y;
private void Start() {
spring = GetComponent<SpringJoint>();
if (!spring) { throw new System.Exception("spring joint is needed"); };
orig_anchor = spring.connectedAnchor;
orig_rotation = transform.localRotation;
orig_pos_y = transform.localPosition.y;
orig_pos_x = transform.localPosition.x;
}
public void processPlungerInput (bool isKeyPressed) {
if (isKeyPressed) {
spring.spring = 0;
if (transform.localPosition.z < max_movement_z) {
transform.localPosition += new Vector3(0,0,movement_increment_z);
}
} else {
spring.spring = spring_power;
}
}
// preserve only z axis movement and no rotation at all.
private void FixedUpdate() {
transform.localRotation = orig_rotation;
transform.localPosition = new Vector3(orig_pos_x, orig_pos_y, transform.localPosition.z);
}
}