Unity 合成大西瓜类游戏如何避免“发射物与多个相同物体同时结合”的问题

事前准备:1.制作多个不同尺寸的球体预制体,分别挂上2D刚体组件与碰撞体

2.将摄像机的投影模式设置为正交

3.添加 Ball 与 BallPreparedToFall 这两个tag

然后为除最大球以外的所有预制体添加以下脚本,并配置参数:

using UnityEngine;

public class BecomeBigger : MonoBehaviour
{
    [SerializeField] GameObject biggerBall;
    Vector2 collisionPosition;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        GameObject obj = collision.collider.gameObject;
        if (obj.tag == "Ball" && tag == "Ball")
        {
            if (GetComponent<SpriteRenderer>().sprite.name == obj.GetComponent<SpriteRenderer>().sprite.name
                && GetComponent<Rigidbody2D>().constraints == RigidbodyConstraints2D.None
                && obj.GetComponent<Rigidbody2D>().constraints == RigidbodyConstraints2D.None)
            {
                collisionPosition = collision.collider.ClosestPoint(transform.position);
                Destroy(obj);
                Destroy(gameObject);
                if (gameObject.GetInstanceID() > collision.gameObject.GetInstanceID())
                {
                    Instantiate(biggerBall, collisionPosition, Quaternion.identity);
                }
            }
        }
        if (tag == "BallPreparedToFall")
        {
            if (GetComponent<SpriteRenderer>().sprite.name == obj.GetComponent<SpriteRenderer>().sprite.name
                && GetComponent<Rigidbody2D>().constraints == RigidbodyConstraints2D.None
                && BallsSpawner.canCombine)
            {
                collisionPosition = collision.collider.ClosestPoint(transform.position);
                Destroy(obj);
                Destroy(gameObject);
                Instantiate(biggerBall, collisionPosition, Quaternion.identity);
                BallsSpawner.canCombine = false;
            }
        }
    }
}

添加一个空物体,命名为BallsSpawner,添加以下脚本:

using UnityEngine;

public class BallsSpawner : MonoBehaviour
{
    [SerializeField] GameObject[] balls;//发射球数组
    [SerializeField] float hitForce = 35;//发射力度

    public static bool canCombine = true;//解决问题:发射球遇到多个相同球只合并其中一个
    GameObject currentBall;//当前生成的球
    GameObject priorBall = null;//上一个球
    Vector2 directionNormalized;//发射方向的单位矢量
    float timeInterval = 0.5f;//生成球的时间间隔
    bool isTiming = false;//是否在计时
    float timer = 0;//计时器

    private void Start()
    {
        currentBall = Instantiate(balls[Random.Range(0, balls.Length)], transform.position, Quaternion.identity);
        currentBall.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezeAll;//冻结待发射的球
        currentBall.tag = "BallPreparedToFall";//给待发射球一个tag
        priorBall = currentBall;//记录该球
    }
    private void Update()
    {
        directionNormalized = (Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position).normalized;
        if (!isTiming)
        {
            if (Input.GetMouseButtonDown(0))
            {
                currentBall.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.None;
                currentBall.GetComponent<Rigidbody2D>().velocity = directionNormalized * hitForce;
                isTiming = true;
            }
        }

        if (isTiming)
        {
            timer += Time.deltaTime;
            if (timer >= timeInterval)
            {
                timer = 0;

                currentBall = Instantiate(balls[Random.Range(0, balls.Length)], transform.position, Quaternion.identity);
                currentBall.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezeAll;
                currentBall.tag = "BallPreparedToFall";

                if (priorBall != null)
                {
                    priorBall.tag = "Ball";//恢复发射球的tag
                }
                priorBall = currentBall;

                canCombine = true;
                isTiming = false;
            }
        }
    }
}

配置待发射球与击球力度的相关参数:

然后点击屏幕,即可生成向指定位置发射的球体,相同球体会合并:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值