这次我们实现转向轴。
先贴两个图给个直观印象:
题外话一:
猪哥考虑过学一学3DMax,一是方便自己做点需要的模型,二是工作中可以更好地和美术沟通,三是某些时候这种复合型淫才的招聘薪资屌爆了。
但综合考虑了一下,这种没什么难度但需要一定时间的活还是留到更后面一点再做,先赶程序本职工作最要紧的搞扎实了先。
题外话二:
我这人好妄自菲薄,刚接触Besiege这个游戏时,以为肯定用的第三方高大上的物理引擎,Unity自带的不一定好用。后来一查官网,发现就是用Unity开发的,而Unity同Unreal一样,用的都是PhysX。毕竟也是大红大紫的引擎,不用个世界前三的物理模组怎么好意思和人打招呼。
至于不同引擎封装的方式会不会有差异?PhysX有没有随Unreal的开源一起开源?这些问题以后有时间再深入探究。反正我现在的感受是物理引擎还是用开源的好,不然最基本的很多参数怎么用都很难把握,再比如FixedJoint的连结力表现得有些像磁力,未彻底摔断的两个箱子还可以再吸回去连在一起,那如何获得更真实的分离效果?等。
恩,说了这么多别的,不多啰嗦这转向轴的功能了,下面直接讲实现过程和注意事项。
首先肯定是用HingeJoint这个组件啦,挑几个关键的参数讲下:
(为表达清晰方便,我用门安装在墙上的例子,首先HingeJoint铰链是绑在门上的)
1.Anchor
铰链相对于门的本地坐标
2.Axis
铰链旋转轴的朝向
3.Auto Configure Connected Anchor
是否自动计算Connected Anchor,此项一般默认勾选,这样会根据Anchor的位置及场景中门和墙的实际位置,决定铰链绑在墙的哪里
4.Connected Anchor
上面说过了,假如不自动计算,手动填写,则会多看到一个小箭头表明铰链具体安装在墙的位置,运行游戏后,门的铰链绑点会自动挪到此位置。
5.Target Velocity
正数和负数分别朝两个方向转动,但这里有个坑爹的bug,Unity5.0-5.2这个参数是没法设成负值的,意味着轴只能朝一个方向转,果断升5.3吧。
我的SteelingHinge Prefab是这么构成的:
SteelingHing(空物体,绑HingeCtrl控制脚本)
Stick(Mesh、MeshRenderer、Rigidbody、HingeJoint)
Base(Rigidbody、BoxCollider)
BaseMesh(Mesh、MeshRender)
由于那个C型基座的模型是随便在资源中扒出来的,朝向作了些调整,所以Prefab结构略复杂了些,最简单的应该是一个基座绑一个轴完毕。
下面是HingeCtrl控制脚本:
using UnityEngine;
using System.Collections;
public class HingeCtrl : MonoBehaviour {
private HingeJoint hj;
private JointMotor motor;
public float rotSpd = 75;
public KeyCode leftKey = KeyCode.LeftArrow;
public KeyCode rightKey = KeyCode.RightArrow;
void Start ()
{
hj = GetComponentInChildren<HingeJoint>();
motor = hj.motor;
motor.force = 100;
motor.targetVelocity = 0;
hj.motor = motor;
hj.useMotor = true;
}
void Update ()
{
if (Input.GetKey(leftKey))
{
OnLeftCtrlBtn();
}
if (Input.GetKey(rightKey))
{
OnRightCtrlBtn();
}
if (Input.GetKeyUp(leftKey) || Input.GetKeyUp(rightKey))
{
OnCtrlBtnUp();
}
}
public void OnLeftCtrlBtn()
{
motor.targetVelocity = rotSpd;
hj.motor = motor;
}
public void OnRightCtrlBtn()
{
motor.targetVelocity = -rotSpd;
hj.motor = motor;
}
public void OnCtrlBtnUp()
{
motor.targetVelocity = 0;
hj.motor = motor;
}
}
这里头只有一点需要特别说下,想改变Motor的参数,单纯地直接改是没法奏效的,得像官方示例那样先从HingeJoint把Motor引用出来,改完参数后,再把Motor赋值回去。
一时想不出其中的玄机,照做就好了。