当前位置:   article > 正文

unity 制作小汽车跑起来_unity做一个小汽车

unity做一个小汽车


前言

  • 以下方法可以说是纯代码实现的,让汽车动起来还有比这个简便的方法,但是以下方式实现是为了更明白unity里面可能出现的一些问题,之后会在写另一个简单的方法.

一、制作简易汽车

  1. 创建一个cube作为车身名为CarBody,在拿一个cube名为CarHead作为车头,创建四个Cylinder作为车轮名为WheelRF(右前轮),WheelLF(左前轮),WheelLB(左后轮),WheelRB(右后轮),
  2. 名字和物体要对应,方便管理
    在这里插入图片描述
  3. 把车头和轮子挂在CarBody下.
    在这里插入图片描述

二、车轮向前向后转动

  1. 创建一个脚本wheelControl挂在四个轮子上
  2. 在脚本里写上上代码
  3. 在类下面写一个轮子转动的方法
public void RotWheel(bool isForward)
    {
        transform.Rotate(Vector3.up * 360 * Time.deltaTime * (isForward ? -1 : 1));
    }
  • 1
  • 2
  • 3
  • 4
  1. 在Update里写
if (Input.GetKey(KeyCode.W))
        {
            RotWheel(true);
        }
if (Input.GetKey(KeyCode.S))
        {
            RotWheel(false);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

为什么是Vector3.up:刚开始创建Cylinder时,Vector3.up指的方向是刚开始时的y轴,然后作为车轮以z轴旋转了90度,但是Cylinder物体的y轴也会随着转动,所以如果车轮要向前转的话,不能看现在的车轮方向轴,所以写Vector3.up

360 * Time.deltaTime :每秒转360度

(isForward ? -1 : 1)正数向前转,负数向后转,按下w,true,向前转,但是因为Cylinder旋转过,所以要注意

  • 回到unity运行,轮子可以转动了,但是发现轮子"变异"了
    在这里插入图片描述

  • 这是因为轮子作为CarBody的子物体,子物体会受到父物体的位置变化形状变化影响所以我们要创建一个空物体名为Control,CarBody和四个轮子都挂在Control下,这样就正常了
    在这里插入图片描述

三.控制车轮向左向右转弯

  1. 汽车转弯只需要控制前两个轮胎转动就行了,
  2. 创建一个脚本挂在Control下
  3. 在CarControl类下面创建两个Transform控制前面两个轮子
public Transform LF;
public Transform RF;
  • 1
  • 2
  1. 接着写轮子转弯的方法
public void FowardWheelLF(Transform Wheel, bool isRight)
    {
        Wheel.Rotate(Vector3.up * 30 * Time.deltaTime * (isRight ? 1 : -1),Space.World);
    }
  • 1
  • 2
  • 3
  • 4

第二个参数Space.World说明Vector3.up是沿着世界坐标的up方向转动车轮

  1. 在Update里写
		if (Input.GetKey(KeyCode.A))
        {
            FowardWheelLF(LF, false);
            FowardWheelLF(RF, false);
        }
        if (Input.GetKey(KeyCode.D))
        {
            FowardWheelLF(LF, true);
            FowardWheelLF(RF, true);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 回到unity,将对应的车轮拖到相应的位置
    在这里插入图片描述
  • 这样就成功了,但是,如果车子是上坡的话,再来看看这轮转动是什么样的
    在这里插入图片描述
  • 会发现前后是没问题的,但是向左向右转的时候,是有点问题的.它是按照世界坐标转动的,但是汽车运动是变动的
  • 所以我们来创建两个空物体,分别叫LF_obj,RF_obj,
  • 然后把空物体拖到对应轮胎的中心地方
    在这里插入图片描述
    在这里插入图片描述
  • 然后把两个空物体挂在Control下,再把两个前轮分别挂在对应的下面
    在这里插入图片描述
  • 在Control下的脚本里就不是把轮子拖进去了,把轮子对应的空物体拖进去
    在这里插入图片描述
  • 然后把控制轮子转弯的方法里第二个参数Space.World就可以删掉了,
  • 最后运行没什么问题

四.车子前后跑起来

  • 在CarControl脚本里的update里加上
		if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward * 5 * Time.deltaTime);//每秒向前走5m
        }
        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(Vector3.forward * -1 * 5 * Time.deltaTime);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 车子就可以向前向后移动了

五.车子左右转弯

  • 在CarControl脚本下update里按下A健里面加上

transform.Rotate(Vector3.up * -1 * Time.deltaTime * 60);

  • 按下D健加上

transform.Rotate(Vector3.up * Time.deltaTime * 60);

  • 注意的是Control这个空物体必须在CarBody中心,
    在这里插入图片描述
  • 转弯完成,但是发现车子原地不动也可以转弯,
  • 所以我们在刚才的代码加个条件,按下A或D时,还要按下W健才能转弯
			if (Input.GetKey(KeyCode.W))
            {
                transform.Rotate(Vector3.up * -1 * Time.deltaTime * 60);
            }
  • 1
  • 2
  • 3
  • 4
            if (Input.GetKey(KeyCode.W))
            {
                transform.Rotate(Vector3.up * Time.deltaTime * 60);
            }
  • 1
  • 2
  • 3
  • 4
  • 这样原地转动时只有车轮转了

六.限制车轮转动角度

  • 发现转弯时,车轮可以一直转,现实中,车轮转弯有限制的.
  • 我们把WheelLF和WheelRF先拿出来
  • 然后设置LF_obj和RF_obj的属性面板里transform里的Rotation里的y设置90
    在这里插入图片描述
  • 设置完成后,再将车轮挂到上面去
  • 然后再CarControl脚本里的update里按下A健车轮转弯设个条件
if (RF.localEulerAngles.y >= 60 )
            {
                FowardWheelLF(LF, false);
                FowardWheelLF(RF, false);
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • D健也一样
if (LF.localEulerAngles.y<=120)
            {
                FowardWheelLF(LF, true);
                FowardWheelLF(RF, true);
            }
  • 1
  • 2
  • 3
  • 4
  • 5

七.汽车倒退时转弯

  • 我们发现汽车后退时没有写转弯的代码
  • 我们在按下A或D时,还要按下W健才能转弯的条件下价格else if
if (Input.GetKey(KeyCode.W))
            {
                transform.Rotate(Vector3.up * -1 * Time.deltaTime * 60);
            }
            else if (Input.GetKey(KeyCode.S))
            {
                transform.Rotate(Vector3.up * 1 * Time.deltaTime * 60);
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 注意正负号
  • 还有D健里也是一样
if (Input.GetKey(KeyCode.W))
            {
                transform.Rotate(Vector3.up * Time.deltaTime * 60);
            }
            else if (Input.GetKey(KeyCode.S))
            {
                transform.Rotate(Vector3.up * -1 * Time.deltaTime * 60);
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

八.车轮自动回正

  • 我们发现车子走动转弯后,再次点击W时,车轮还是弯的,没有自己回正,
  • 我们判断车子是否已经转动过,在CarControl脚本update里写
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.A))
        {
            IsComeback = true;
        }
  • 1
  • 2
  • 3
  • 4
  • 如果转动过,那么接着写
		if (IsComeback)
        {
            LF.localEulerAngles = new Vector3(0, Mathf.SmoothDamp(LF.localEulerAngles.y, 90, ref num, 0.5f), 0);
            RF.localEulerAngles = new Vector3(0, Mathf.SmoothDamp(LF.localEulerAngles.y, 90, ref num, 0.5f), 0);
            if (LF.localEulerAngles.y==90)
            {
                IsComeback = false;
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 此外,在类下面创建两个值
    float num;
    bool IsComeback = false;
  • 1
  • 2

总结

最后,差不多是一个完美的汽车了,可以自己给材质球上颜色,或者直接在asset story里下载免费的跑车,就很拉风.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/98887
推荐阅读
相关标签
  

闽ICP备14008679号