愤怒的小鸟
Xmind部分流程图:
开发环境
Unity3D , Visual Studio
一,素材准备:
切片与分层
运动系统的搭建(弹簧节, 双刚体)
二,小鸟的拖拽:
1. 添加碰撞体,实现鼠标与小鸟的交互
2. 令碰撞体(小鸟)与鼠标位置重合
tips:小鸟的坐标系为视窗(摄影机)(三维!)的正中央,而鼠标的坐标系(二维!)默认是屏幕的最左下角
(1)修改坐标系 —把鼠标的坐标系改为摄像机的居中坐标系 (2)删除小鸟新坐标中的z轴
if(isClick)
{// 鼠标一直按下,进行位置跟随
transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 小鸟的坐标系是世界坐标(屏幕中间),与鼠标坐标系(以屏幕左下角)不一样。
transform.position += new Vector3(0, 0, 10); // 去掉转换后新小鸟坐标轴上多出来的z轴
/*transform.position += new Vector3(0, 0, -Camera.main.transform.position.z); 直接剪掉照相机的z轴坐标*/
3. 限定弹簧的最大长度
(1)确定好两个目标物体
tips:弹弓右端作为物体时需要设置一个“子物体”作为拉弓时的固定位置
(2)设置向量:
固定向量的头和尾,制作出只有方向的单位向量
再设置其最大的距离
if (Vector3.Distance(transform.position, rightPos.position) > maxDis)
{// 进行位置限定
//创建一个三维向量,将其单位化(只希望其有方向,而没有距离)
Vector3 pos = (transform.position - rightPos.position).normalized;
//获得最大长度的向量;
pos *= maxDis;
transform.position = pos + rightPos.position;
三,小鸟的飞出:
1. 设置好动力学开关,使之自动进行好物理计算
tips:需要设置好开关延迟 (时间太短则无法进行完运算,时间太长则无法飞出)
2. 弹簧节失活,小鸟飞出
private void OnMouseUp(){
isClick = false;
rg.isKinematic = false; // 松开鼠标时,开始进行物理计算
Invoke("Fly", 0.1f); //参数一:待执行方法名 参数二:延长的时间(时间太短无法计算完,太长则无法弹出)
}
void Fly(){
sp.enabled = false; // 松开鼠标时,sp模块(弹簧节模块)失活
}
四,小猪的受伤效果:
1. 碰撞检测(两种方法)
法一:private void OnCollisionEnter2D(Collision2D collision)
组件上:需要碰撞的两个物体都挂上ragidbody
效果上:存在碰撞间的反作用,并将碰撞的物体记为参数
-------------》 反击并记仇
法二: private void OnTriggerEnter(Collider collision)
组件上:只需要一个物体挂上ragidbody
效果上:不存在碰撞间的反作用,但也会将碰撞的物体记为参数
-------------》 不反击但记仇
2. 取相对速度的值作为小猪受伤死亡的判断条件**
tips:单纯以碰撞接触速度为判断条件不够准确
private void OnCollisionEnter2D(Collision2D collision) // 组件上:需要碰撞的两个物体都挂上ragidbody //效果上:存在碰撞间的反作用,并将碰撞的物体记为参数
{
// 取碰撞的相对速度
if(collision.relativeVelocity.magnitude > maxSpeed) // 返回碰撞体相对速度的向量数值!
{
//Destroy(gameObject);
}
else if(collision.relativeVelocity.magnitude > minSpeed && collision.relativeVelocity.magnitude < maxSpeed)
{
print(collision.relativeVelocity.magnitude);
render.sprite = hurt;
}
}