山寨Besiege(四)操控轴

这次我们实现转向轴。

先贴两个图给个直观印象:



题外话一:

猪哥考虑过学一学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赋值回去。

一时想不出其中的玄机,照做就好了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值