C#游戏制作(1)

愤怒的小鸟
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;
        }
    }
发布了11 篇原创文章 · 获赞 29 · 访问量 863

猜你喜欢

转载自blog.csdn.net/a13352912632/article/details/103796127
今日推荐