Unity的2d不是很熟悉。其实,unity也是不很熟悉。先用3d实现一下核心的机制吧。
设定摄像机俯视,在x-z平面内设定游戏的平面。
用基础的几何形,构成游戏元素。
如上图,有了齿轮,小球,豆子,边框挡板及白色底景。
小球设置:
1-PhysicMaterial:
Collider中,添加一个PhysicMaterial,为了使得小球无能量损失,Friction全部设置为0,而Bounciness设为1,其余的Friction、Bounciness混合用来体现不同材质碰撞的一些混合效果,这里用处不大。各向异性,也没有使用必要。
2-RigidBody:
有了这个刚体component后,可以应用其velocity属性,比较方便。
Mass为质量,如果对其施加一个作用力,有F=ma的效果,这里暂时不用,保留初始值1;
Drag为直线空气阻力,始终与运动方向相反,显性的变现为:直线运动慢慢停止,这里设为0;
Angular Drag为旋转空气阻力,与角速度相反,显性的表现为:旋转运动慢慢停止,这里设为0;
质量、作用力、直线及角动空气阻力合理组合,可以模拟出香蕉球效果(马格努斯力),后话后话,有待将来做一个《儒尼尼奥教你任意球》。
Constrains可以限定运动平面,及角动轴,Position设定Y值衡定,Rotation设定仅能绕Y轴转动。
3-脚本:
设定一个初速度而已
1 using UnityEngine; 2 using System.Collections; 3 4 public class HeroBeing : MonoBehaviour { 5 public Vector3 heroV = new Vector3(4f,0,6f); 6 void Start () { 7 rigidbody.velocity = heroV; 8 } 9 void Update () { 10 11 } 12 }
挡板设置:
PhysicMaterial,赋予如小球的材质。这样一来,小球与之碰撞,将获得完美的反弹。入射角==反射角,入射速度==反射速度。需要注意的事项,物理引擎中有一些默认的参数设定,在edit-projectsetting中
1-Sleep Velocity,低于这个值,不再施加力的作用,运动将停止
2-Sleep Angular Velocity,角动方向,如上
3-Bounce Threshold,反弹的阀值,低于这个值将不作反弹,(后面会入这个坑)
豆子设置:
1-Trigger:
在Collider中,Is Trigger打勾,意味着碰撞体将作为tigger检测
2-脚本:
void OnTriggerEnter(){ GameObject.Destroy(gameObject); }
检测到碰撞后,自身销毁
齿轮设置:
1-Tigger
在Collider中,Is Trigger打勾
2-脚本:
自身转动,用transform中Rotate的方法,定Y轴为旋转轴,角速度为函数参数
public void Whirling(float _angleV){ transform.Rotate(Vector3.up,_angleV); }
检测到小球的碰撞,使得小球速度为0,带着小球一起做圆周运动。因此,将小球的父级动态设置为齿轮,较为方便
void OnTriggerEnter(Collider hero){ hero.rigidbody.velocity = Vector3.zero;//still the hero hero.transform.parent = transform;//set the hero as a child isWhirling = true; }
将小球推出,赋予小球速度,这个速度的方向与齿轮径向一致。找到子物体小球,将它推出
public void PushHero(float _fSpeed){//fSpeed : multi isWhirling = false; GameObject hero = transform.Find("hero").gameObject; if(hero){ hero.transform.parent = transform.parent; Vector3 dir = hero.transform.position -transform.position; dir = dir.normalized; hero.rigidbody.velocity = dir*_fSpeed; } }
Update:设定用鼠标左键触发推出小球
void Update () { if(isWhirling){ Whirling(angleV); if(Input.GetMouseButton(0)){ PushHero(fSpeed); } } }
在Unity中,设定这些非常方便并且直观,完全可以是想到了,就做到了。运行一下,小球能直线运动,与挡板做反弹,遇到齿轮,停住。齿轮带着小球做圆周运动,按鼠标左键,小球被弹出,遇到豆子,吃掉豆子。
很顺利。