今天的游戏可以玩了,仍存在的问题:
1.激光不关闭
2.飞鼠下落状态并不是fall
3.有“!”错误提示

新内容:

1.飞鼠的死亡模式:碰到障碍物会死亡(图片-动画)
2.奖励模式:金币的随机放置(图层、脚本编写)
3.记录模式:屏幕角上记录获取到的金币数量(GUI、文字美化)
感想:今天是补课的倒数第二天,一个跑酷类小游戏已经大体成型,想了想如果把时间挤在一起做的话大概需要个一两天吧。

详细分析:

1.animator界面的操作和逻辑分析

比如新增变量die,fall后怎么连线呢?

这里写图片描述

连线后的设置不是按钮!而是点击线条!具体逻辑看你了

这里写图片描述

关键点1,下图勾上 碰撞体才能被检测到

这里写图片描述

关键点2,下面增加的变量是为了控制die,注意执行前要选中!选中!

这里写图片描述

关键点3,暂时不知道什么问题了,但是你经常忘记设置这里:

这里写图片描述

2.激光和金币的随机出现(像无穷无尽的房间一样~所以代码可以借鉴)
以下是控制本游戏中需要随机出现的上述三者 完整代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Room : MonoBehaviour {

    public GameObject[] availableRooms; //数组变量  
    public List<GameObject> currentRooms; //list是链表,GameObject是一种类,currentRooms是当前房间
    private float screenWidthInPoints;//is当前屏幕的宽度
    //以下随机金币
    public GameObject[] avaliableCoins;
    public List<GameObject> coins;
    public float objectsMinDistance = 5.0f; //随机创建的一坨金币群的 水平方向的最小和最大距离
    public float objectsMaxDistance = 10.0f;

    public float objectsMinY = -1.4f ;  //金币群的最大、最小高度
    public float objectsMaxY = 1.4f ;

    public float objectsMinRaotation = -45.0f;  //金币群的旋转幅度
    public float objectsMaxRaotation = 45.0f;
    //以上

    void Start () 
    {
        float height = 2.0f * Camera.main.orthographicSize;//获取当前视图范围的高度
        screenWidthInPoints = height * Camera.main.aspect; //以上获取了长宽比 ,注意都是针对屏幕而不是背景图尺寸什么的
    } //当前屏幕的宽度 --he says

    void addCoins(float lastObjectX) //金币位置
    {
        int randomCoinIndex = Random.Range(0,avaliableCoins.Length);
        GameObject coin = (GameObject)Instantiate(avaliableCoins [randomCoinIndex]);
        float coinPositionX = lastObjectX + Random.Range(objectsMinDistance,objectsMaxDistance);
        float randomY = Random.Range(objectsMinY,objectsMaxY );
        coin.transform.position = new Vector3 (coinPositionX,randomY,0);
        float rotation = Random.Range(objectsMinRaotation,objectsMaxRaotation);//rotation定旋转角度
        coin.transform.rotation = Quaternion.Euler(Vector3.forward*rotation);
        coins.Add(coin);
    }

    void IsGeneratorCoinsAndLaser()//金币和激光 

    {
        List<GameObject> DeleteCoinsAndLaser = new List<GameObject>();//保存将要删掉的
        //bool addRooms = true;//判断是否增加
        float playerX = transform.position.x;//获取飞鼠的位置的X轴
        float DeleteCoinsAndLaserX = playerX - screenWidthInPoints;//坐标计算
        float AddCoinsAndLaserX = playerX + screenWidthInPoints;
        float farCoinsAndLaserIndex = 0;

        foreach(var coin in coins)                  //var:任何 (对于任何在coins 里面的coin
        {
            float coinX = coin.transform.position.x;  //定义coinX来获取当前X轴坐标
                farCoinsAndLaserIndex = Mathf.Max(farCoinsAndLaserIndex,coinX);//返回最大值
            if (coinX < DeleteCoinsAndLaserX)         //判断当前获取的金币的X轴位置
                DeleteCoinsAndLaser.Add(coin);
        }
        foreach(var coin in DeleteCoinsAndLaser)  
        {
            coins.Remove (coin);
            Destroy (coin);               //这几处理是 因为不能直接删原来的链表
        }
        if (farCoinsAndLaserIndex < AddCoinsAndLaserX) //判断是否需要增加金币了
            addCoins(farCoinsAndLaserIndex);
    }

    void addRoom(float farRoomID)//farRoomID最远的房间,也就是最右侧的,对应着,同时删除的当然也就是最左边的
    {
        int randomRoomIndex = Random.Range(0,availableRooms.Length); //确定了room的选择范围
        GameObject room = (GameObject)Instantiate(availableRooms [randomRoomIndex]);
        float roomWidth = room.transform.FindChild("floor").localScale.x;//当前房间的宽度..//FindChild子。。"floor"和你的具体重命名一致
        float roomCenter = roomWidth * 0.5f + farRoomID; //中心点roomCenter = roomWidth * 0.5f一般是它房间的一半。+ farRoomID是另外一个房间多出来的部分
        room.transform.position = new Vector3 (roomCenter,0,0);//定义房间,然后拿上面值来用
        currentRooms.Add(room);
    }       
    void IsGeneratorRoom()
    {
        List<GameObject> DeleteRoom = new List<GameObject>();//保存将要删掉的房间
        bool addRooms = true;//判断是否增加房间
        float playerX = transform.position.x;//获取飞鼠的位置的X轴

        float DeleteRoomX = playerX - screenWidthInPoints;//坐标计算
        float AddRoomX = playerX + screenWidthInPoints;
        float farRoomIndex = 0;
        foreach (var room in currentRooms)//判断哪些房间需要删除
        {
            float roomWidth = room.transform.FindChild("floor").localScale.x;
            float roomStartX = room.transform.position.x - roomWidth * 0.5f;
            float roomEndX = roomStartX + roomWidth;
            //下面是判定的核心环节 (用if语句:  
            if(roomStartX > AddRoomX) 
                addRooms = false;
            if(roomEndX < DeleteRoomX) 
                DeleteRoom.Add(room);
            farRoomIndex = Mathf.Max(farRoomIndex,roomEndX); //知道了新增加的房间的需要的长度
        }
        foreach (var room in DeleteRoom)
        {
            currentRooms.Remove(room);         
            Destroy(room);
        }
        if (addRooms)
        {
            addRoom(farRoomIndex);
        }
    }
        void FixedUpdate()
        {
            IsGeneratorRoom();
        IsGeneratorCoinsAndLaser();

        }
    void Update () 
    { }
}

栏内设置:

这里写图片描述

Script 脚本
序号1“所有房间”,随着所需点击更改Size值,控制着Element会出现多少个,然后可以把预制件房间拉进去了。
序号2“当前金币”,从脚本可以看出金币和其他类似物件可以通用代码(比如激光就直接拉进去了),因此只需更改Size,
比如Size=2,下面出现了Element0,Element1,分别把对象金币和激光拖进去。如果你想要其他装饰品,可以直接更改Size再加入,简单易行。
Coins 是金币的尺寸啥的。

3.游戏框外的金币统计行
对用户可见的当然需要GUI咯,主要是一些美观,绑定在哪个对象?自然也是mouse
以下是mousecontrol脚本全部代码:

using UnityEngine;
using System.Collections;

public class mousecontrol : MonoBehaviour {
    public float jetpackFore = 75.0f; //定义一个力
    public float movespeed = 5.0f;

    public Transform groundCheckTransform; //+存储刚才创建的黄色新
    private bool grounded; //判断是否落地
    public LayerMask groundCheckLayerMask;//保存...
    Animator animator;//创建一个新动画  /以上fly and run
    public ParticleSystem jetpack;

    public Texture2D coinIocn;  //保存硬币图标


    private bool dead = false;//飞鼠死亡


    private uint coins = 0;


    void Start () {
        animator = GetComponent<Animator>(); //对它进行初始化操作

    }
    void Update () {

    }

    void OnGUI()
    {
        DisplayCoin ();

    }

    //收集金币数量
    void CollectCoin(Collider2D collider)//碰撞体做形参,Collider2D:二维碰撞体
    {
        coins++;
        Destroy(collider.gameObject); //吃掉的金币在屏幕上消失

    }

    void DisplayCoin()
    {
        Rect coinIconRect = new Rect (10,10,32,32);//定义一个矩形,写下位置
        GUI.DrawTexture (coinIconRect,coinIocn);
        GUIStyle style = new GUIStyle();
        style.fontSize = 30;
        style.fontStyle = FontStyle.Bold;
        style.normal.textColor = Color.yellow;
        Rect LabelRect = new Rect (45,10,60,32);
        GUI.Label(LabelRect,coins.ToString(),style);
    }

    //以下控制死亡
    void HitbyLaser(Collider2D laserCollider)
    {dead = true;
        animator.SetBool("dead",dead);
    }
    //以上

    void OnTriggerEnter2D(Collider2D collider) //激光碰撞体和飞鼠的圆形碰撞体
    {
        //以下金币
        if (collider.gameObject.CompareTag("Coins")) //CompareTag匹配,多少个种类碰撞体就用多少个CompareTag,
            CollectCoin (collider);//判断碰到的碰撞体是金币,则

        else
            HitbyLaser(collider);//如果不是金币,则是激光,就要执行其他

    }


    void UpdateGroundedStatus()//更新老鼠状态/是否落地
    {
        grounded = Physics2D.OverlapCircle(groundCheckTransform.position,0.1f,groundCheckLayerMask);//OverlapCircle专门用来做碰撞检测的 //0.1f意半径0.1f的圆
        animator.SetBool("grounded",grounded);//来获取bool变量的额名字,注意符合一致

    }

    void AdjustJetPack(bool jetPackActive)
    {
        jetpack.enableEmission =!grounded;
        //jetpack.emissionRate = jetPackActive? 300.0f:75.0f;//可略,燃料启动过程,注释后就不会再空中断火了,可是渐渐地过程还在么?改天自己测试

    }

    void FixedUpdate() //区别:上者不是按照固定时间间隔,而这个是。
    {
        bool ForceActive = Input.GetKeyDown(KeyCode.W);//设置鼠标操作,所以定义一个布尔型
        bool ForceActive1 = Input.GetKeyDown(KeyCode.D);
        bool ForceActive2 = Input.GetKeyDown(KeyCode.A);

        ForceActive = ForceActive && !dead; //判定飞鼠活着的状态下点击WAD键盘才能有用



        if (ForceActive)
        {
            GetComponent<Rigidbody2D>().AddForce(new Vector2(0,jetpackFore));//Rigidbody2D是与你首页增加的那个钢体名字一致,这是操作钢体的

        }
        if (!dead)//判定死亡后就不再能够前进后退
    {

        if (ForceActive1)
        {
            Vector2 newVelocity = GetComponent<Rigidbody2D>().velocity;  //想要人物动也就是钢体动,所以获取钢体
            newVelocity.x = movespeed;
            GetComponent<Rigidbody2D>().velocity = newVelocity;
        }
        if (ForceActive2)
        {
            Vector2 newVelocity = GetComponent<Rigidbody2D>().velocity;  //想要人物动也就是钢体动,所以获取钢体
            newVelocity.x = - movespeed;
            GetComponent<Rigidbody2D>().velocity = newVelocity;
        }

    }
        UpdateGroundedStatus();//飞走的代码+执行1.8
        AdjustJetPack(ForceActive);//粒子的代码 +实参

    }
}
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐