事前准备: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;
}
}
}
}
配置待发射球与击球力度的相关参数:
然后点击屏幕,即可生成向指定位置发射的球体,相同球体会合并: