我是靠谱客的博主 健忘小霸王,这篇文章主要介绍unity 制作小汽车跑起来前言一、制作简易汽车二、车轮向前向后转动三.控制车轮向左向右转弯四.车子前后跑起来五.车子左右转弯六.限制车轮转动角度七.汽车倒退时转弯八.车轮自动回正总结,现在分享给大家,希望可以做个参考。
文章目录
- 前言
- 一、制作简易汽车
- 二、车轮向前向后转动
- 三.控制车轮向左向右转弯
- 四.车子前后跑起来
- 五.车子左右转弯
- 六.限制车轮转动角度
- 七.汽车倒退时转弯
- 八.车轮自动回正
- 总结
前言
- 以下方法可以说是纯代码实现的,让汽车动起来还有比这个简便的方法,但是以下方式实现是为了更明白unity里面可能出现的一些问题,之后会在写另一个简单的方法.
一、制作简易汽车
- 创建一个cube作为车身名为CarBody,在拿一个cube名为CarHead作为车头,创建四个Cylinder作为车轮名为WheelRF(右前轮),WheelLF(左前轮),WheelLB(左后轮),WheelRB(右后轮),
- 名字和物体要对应,方便管理
- 把车头和轮子挂在CarBody下.
二、车轮向前向后转动
- 创建一个脚本wheelControl挂在四个轮子上
- 在脚本里写上上代码
- 在类下面写一个轮子转动的方法
复制代码
1
2
3
4
5public void RotWheel(bool isForward) { transform.Rotate(Vector3.up * 360 * Time.deltaTime * (isForward ? -1 : 1)); }
- 在Update里写
复制代码
1
2
3
4
5
6
7
8
9if (Input.GetKey(KeyCode.W)) { RotWheel(true); } if (Input.GetKey(KeyCode.S)) { RotWheel(false); }
为什么是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下,这样就正常了
三.控制车轮向左向右转弯
- 汽车转弯只需要控制前两个轮胎转动就行了,
- 创建一个脚本挂在Control下
- 在CarControl类下面创建两个Transform控制前面两个轮子
复制代码
1
2
3public Transform LF; public Transform RF;
- 接着写轮子转弯的方法
复制代码
1
2
3
4
5public void FowardWheelLF(Transform Wheel, bool isRight) { Wheel.Rotate(Vector3.up * 30 * Time.deltaTime * (isRight ? 1 : -1),Space.World); }
第二个参数Space.World说明Vector3.up是沿着世界坐标的up方向转动车轮
- 在Update里写
复制代码
1
2
3
4
5
6
7
8
9
10
11
12if (Input.GetKey(KeyCode.A)) { FowardWheelLF(LF, false); FowardWheelLF(RF, false); } if (Input.GetKey(KeyCode.D)) { FowardWheelLF(LF, true); FowardWheelLF(RF, true); }
- 回到unity,将对应的车轮拖到相应的位置
- 这样就成功了,但是,如果车子是上坡的话,再来看看这轮转动是什么样的
- 会发现前后是没问题的,但是向左向右转的时候,是有点问题的.它是按照世界坐标转动的,但是汽车运动是变动的
- 所以我们来创建两个空物体,分别叫LF_obj,RF_obj,
- 然后把空物体拖到对应轮胎的中心地方
- 然后把两个空物体挂在Control下,再把两个前轮分别挂在对应的下面
- 在Control下的脚本里就不是把轮子拖进去了,把轮子对应的空物体拖进去
- 然后把控制轮子转弯的方法里第二个参数Space.World就可以删掉了,
- 最后运行没什么问题
四.车子前后跑起来
- 在CarControl脚本里的update里加上
复制代码
1
2
3
4
5
6
7
8
9
10if (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); }
- 车子就可以向前向后移动了
五.车子左右转弯
- 在CarControl脚本下update里按下A健里面加上
transform.Rotate(Vector3.up * -1 * Time.deltaTime * 60);
- 按下D健加上
transform.Rotate(Vector3.up * Time.deltaTime * 60);
- 注意的是Control这个空物体必须在CarBody中心,
- 转弯完成,但是发现车子原地不动也可以转弯,
- 所以我们在刚才的代码加个条件,按下A或D时,还要按下W健才能转弯
复制代码
1
2
3
4
5
6if (Input.GetKey(KeyCode.W)) { transform.Rotate(Vector3.up * -1 * Time.deltaTime * 60); }
复制代码
1
2
3
4
5
6if (Input.GetKey(KeyCode.W)) { transform.Rotate(Vector3.up * Time.deltaTime * 60); }
- 这样原地转动时只有车轮转了
六.限制车轮转动角度
- 发现转弯时,车轮可以一直转,现实中,车轮转弯有限制的.
- 我们把WheelLF和WheelRF先拿出来
- 然后设置LF_obj和RF_obj的属性面板里transform里的Rotation里的y设置90
- 设置完成后,再将车轮挂到上面去
- 然后再CarControl脚本里的update里按下A健车轮转弯设个条件
复制代码
1
2
3
4
5
6if (RF.localEulerAngles.y >= 60 ) { FowardWheelLF(LF, false); FowardWheelLF(RF, false); }
- D健也一样
复制代码
1
2
3
4
5
6if (LF.localEulerAngles.y<=120) { FowardWheelLF(LF, true); FowardWheelLF(RF, true); }
七.汽车倒退时转弯
- 我们发现汽车后退时没有写转弯的代码
- 我们在按下A或D时,还要按下W健才能转弯的条件下价格else if
复制代码
1
2
3
4
5
6
7
8
9if (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); }
- 注意正负号
- 还有D健里也是一样
复制代码
1
2
3
4
5
6
7
8
9if (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); }
八.车轮自动回正
- 我们发现车子走动转弯后,再次点击W时,车轮还是弯的,没有自己回正,
- 我们判断车子是否已经转动过,在CarControl脚本update里写
复制代码
1
2
3
4
5if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.A)) { IsComeback = true; }
- 如果转动过,那么接着写
复制代码
1
2
3
4
5
6
7
8
9
10
11if (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
4float num; bool IsComeback = false;
总结
最后,差不多是一个完美的汽车了,可以自己给材质球上颜色,或者直接在asset story里下载免费的跑车,就很拉风.
最后
以上就是健忘小霸王最近收集整理的关于unity 制作小汽车跑起来前言一、制作简易汽车二、车轮向前向后转动三.控制车轮向左向右转弯四.车子前后跑起来五.车子左右转弯六.限制车轮转动角度七.汽车倒退时转弯八.车轮自动回正总结的全部内容,更多相关unity内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复