Unity—“合成大西瓜”小游戏笔记

这篇博客介绍了如何使用Unity从零开始构建一款名为‘合成大西瓜’的休闲游戏。内容包括场景设置、水果碰撞与合成逻辑、UI分数显示、音效播放以及玩家操作等关键代码实现。此外,还详细讲解了游戏过程中的关键步骤,如水果重力、碰撞检测、分数更新和死亡线判断等。通过这个项目,读者可以学习到Unity基础及游戏开发的基本流程。
摘要由CSDN通过智能技术生成

“期盼已久的合成大西瓜”来喽!这是一款一点也不好玩,但是可以一玩玩三个小时的小游戏,废话不多说,直接上代码——>

 

水果脚本、音效脚本、UI分数脚本、玩家操作脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Fruit : MonoBehaviour
{
    public int FruitLV;//水果等级
    private bool isFirstTrigger=true;
    //如果碰撞则执行
    private void OnCollisionEnter2D(Collision2D collision)
    {
       
        if (PlayerManager.Instance.ReadyFruit!=this.gameObject&&collision.gameObject.tag=="Fruit")
        {
            //如果我的等级和我碰到的等级一致
            if(this.FruitLV==collision.gameObject.GetComponent<Fruit>().FruitLV)
            {
                //如果我的实例大于对方的
                if(this.gameObject.GetInstanceID()>collision.gameObject.GetInstanceID())
                {
                    //获取比我高一等级的水果
                    GameObject prefab = PlayerManager.Instance.FruitPrefabs[FruitLV];
                    //水果预制体创建出来
                    GameObject fruit = Instantiate(prefab);
                    //把水果移到指定位置
                    fruit.transform.position = (this.gameObject.transform.position + collision.gameObject.transform.position) / 2;
                    //更新分数
                    UIManager.Instance.Score += this.FruitLV * 2;
                    //播放音效(合成)
                    AudioManager.Instance.PlayAudio(AudioManager.Instance.AudioClips[0]);
                    //销毁对方
                    Destroy(this.gameObject);
                    Destroy(collision.gameObject);
                }
            }
          
        }
    }
    //如果触发则执行
    private void OnTriggerEnter2D(Collider2D collision)
    {
        //不是第一次触发&&不是准备中水果&&触发到的是死亡线
        if (isFirstTrigger == false && PlayerManager.Instance.ReadyFruit != this.gameObject && collision.gameObject.name == "DeadLine") 
        {
            //游戏失败
            SceneManager.LoadScene("合成大西瓜");
        }
        else if (isFirstTrigger = true && collision.gameObject.name == "DeadLine") 
        {
            isFirstTrigger = false;
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public static AudioManager Instance;
    private void Awake()
    {
        Instance = this;
    }
    // Start is called before the first frame update
    //获取声音播放组件
    private AudioSource audioSource;
    void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }
    public AudioClip[] AudioClips;
    public void PlayAudio(AudioClip audioClip)
    {
        audioSource.PlayOneShot(audioClip);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    public static UIManager Instance;
    private void Awake()
    {
        Instance = this;
    }
    private Text scoreText;
    private int score;
    public int Score
    {
        get => score;
        set
        { score = value;
            UpdateScoreText(score);
        }
    }
    private void Start()
    {
        scoreText = transform.Find("ScoreText").GetComponent<Text>();
        score = 0;
    }
    //更新文本分数
    private void UpdateScoreText(int score)
    {
        scoreText.text = score.ToString();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    public static PlayerManager Instance;
    //水果预制体数组
    public GameObject[] FruitPrefabs;
    //准备水果的位置
    public Transform CreatFruitPoint;
    public  GameObject ReadyFruit;
    private void Awake()
    {
        Instance = this;
    }
    // Start is called before the first frame update
    void Start()
    {
        CreatFruit();
        //创建一个水果

    }

    // Update is called once per frame
    void Update()
    {
        if (ReadyFruit == null)
            return;
        if(Input.GetMouseButton(0))
        {
            //跟着鼠标移动,准备落下
            WaitingToFall();
        }
        else if(Input.GetMouseButtonUp(0))
        {
            //恢复水果重力
            ReadyFruit.GetComponent<Rigidbody2D>().gravityScale = 1;
            Invoke("CreatFruit", 1f);
            ReadyFruit = null;
        }
    }
    private void CreatFruit()
    {
        //随机一个索引
        int index = Random.Range(0, 5);
        GameObject prefab = FruitPrefabs[index];
        //预制体实例创建出来
        ReadyFruit = Instantiate(prefab);
        //把水果移动到起点
        ReadyFruit.transform.position = CreatFruitPoint.position;
        //取消水果重力
        ReadyFruit.GetComponent<Rigidbody2D>().gravityScale = 0;
    }
    private void WaitingToFall()
    {
        Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3 newPos = new Vector3(mousePos.x, ReadyFruit.transform.position.y, ReadyFruit.transform.position.z);
        float maxX = 2.77f - ReadyFruit.GetComponent<CircleCollider2D>().radius*0.6f;
        float minX = -2.78f + ReadyFruit.GetComponent<CircleCollider2D>().radius*0.6f;
        if(newPos.x>maxX)
        {
            newPos.x = maxX;
        }
        else if (newPos.x<minX)
        {
            newPos.x = minX;
        }
        ReadyFruit.transform.position = newPos;
    }
}

分为八个部分:

1.场景布置

背景颜色Main Camera—>Camera—>Background

墙、地板2D Object—>Sprite—>Inspector面板—>Sprite<—Create<—Sprites<—Square

2.水果增加重力,碰撞,弹性;墙、地板增加碰撞

增加重力组件:Rigidbody;增加碰撞组件Collider 2D

弹性:Creat—>Physics Material 2D(Friction摩擦力,Bounciness弹性)

3.将水果挂完组件后,做成预制体

4.创建待命水果,且跟随鼠标左右移动,鼠标松开进行下落——PlayerManager脚本

5.水果合成,死亡线逻辑——Fruit脚本

DeadLine(死亡线) Box Collider2D—> Is Trigger√

6.显示分数——UIManager脚本

UI—>Text

7.音效——AudioManager脚本

8.发布Windows

部分脚本逻辑:

水果预设体数组;

待命水果位置;

待命水果;

创建一个待命水果:

                                随机一个索引

                                创建水果

                                把水果移到待命位置

                                取消水果重力

如果待命水果为空,后边不执行(等待延迟)

玩家按下左键

待命水果跟随鼠标左右移动(且做边界)

玩家抬起左键

水果恢复重力

延迟创建待命水果(此时待命水果为空)

延迟后,创建待命水果,

待命水果不为空

Unity零基础专题---【合成大西瓜】_哔哩哔哩_bilibili

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值