我有一个脚本附加到一个网格上,其中有一个运动学,刚体和一个凸形网格对撞机,我想要四处移动。这是我在更新功能中调用的内容:
if (Input.GetKey(forwards)) {
Debug.Log("forwards!!");
//get current velocity in local space
Vector3 localVel = transform.InverseTransformDirection(body.velocity);
//alter so that forward component = speed
localVel = new Vector3(localVel.x, localVel.y, linearSpeed);
//convert back into world space and set to body
Vector3 worldVel = transform.TransformDirection(localVel);
body.velocity = worldVel;
}
其他信息:
body
是我使用Rigidbody
Start()
中分配的GetComponent<Rigidbody>();
变量
linearSpeed
是float
,其值为1
我得到Debug.Log
输出,但我的网格没有移动。我有什么明显的遗失吗?这是我的第一个3D脚本,而不是2D游戏。
答案 0 :(得分:1)
public float speed = 20;
Rigidbody r;
void Start(){
r = gameObject.GetComponent<Rigidbody> (); //Put's reference to local rigidbody into variable "r"
}
void FixedUpdate () {
Vector3 direction = Vector3.zero; //set's current direction to none
//Adds vectors in case that user is pressing the button
if(Input.GetKey(KeyCode.W)) direction += Vector3.forward;
if(Input.GetKey(KeyCode.S)) direction -= Vector3.forward;
if(Input.GetKey(KeyCode.D)) direction += Vector3.right;
if(Input.GetKey(KeyCode.A)) direction -= Vector3.right;
//Normalizez direction (put's it's magnitude to 1) so object moves at same speeds in all directions
r.AddForce (direction.normalized * speed); //Adds direction with magnitude of "speed" to rigidbody
}
Rigidbody 必须附加到与此脚本相同的GO。此脚本使用世界方向,因为使用本地方向更加困难(对象正在旋转并快速更改方向,如果您只想通过替换对Vector3的引用来进行转换,则可以使用它:
if(Input.GetKey(KeyCode.W)) direction += transform.forward;
当然是所有方向。
这是非常基本方式沿着它的本地轴移动对象,为了更好地做你需要为特定对象集编写特定脚本,这一切都取决于你是什么类型的对象移动以及如何移动它。 (它是球体,立方体......,它是否会飞起来,如果它旋转......)。
答案 1 :(得分:0)
如果RigidBody是Kinematic,则意味着通过物理系统以外的方式移动;动画,变换。位置等。使你的刚体非运动,当你设定速度时它应该移动。