Advertisement

Five-unity3D火箭鼠小游戏

阅读量:

游戏今天已经可以正常运行了,在当前状态下仍存在以下问题:① 激光未被关闭;② 飞鼠下落的状态并非属于fall类型;③ 包含"!"类型的错误提示信息

新内容:

飞鼠的死亡机制:当飞鼠遇到障碍物时会自动结束游戏(图片-动画)
奖励机制:游戏内会随机放置积分(图层、脚本编写)
积分记录功能:游戏界面右上方显示玩家获得的所有积分数量(GUI、文字美化)
感想:今天是补课的最后一天,一个跑酷类小游戏已经基本完成。如果将时间集中投入开发的话大概需要一两天的时间。

详细分析:

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

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

这里写图片描述

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

这里写图片描述

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

这里写图片描述

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

这里写图片描述

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

这里写图片描述

游戏世界中光束和宝物会以随机的方式出现(类似于一个永无止境的空间体验),因此开发团队建议参考相关的代码库以实现类似效果。

复制代码
    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 是金币的尺寸啥的。

为了使用户界面直观且易于使用,在游戏框外设置一个金币统计行是必要的。它不仅需要一个图形界面(GUI),还需要确保其设计美观且功能完善。通常情况下是绑定到鼠标的。

复制代码
    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);//粒子的代码 +实参
    
    }
    }

全部评论 (0)

还没有任何评论哟~