欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity2D——捕鱼,炮台锁定辅助线

程序员文章站 2022-05-27 13:40:05
...

        无论是愤怒的小鸟还是泡泡堂,都需要一定的辅助线,捕鱼也不例外,在锁定鱼儿的时候,亦需要辅助线连接炮台与被锁定的鱼儿。

如图所示,创建场景及对象

Unity2D——捕鱼,炮台锁定辅助线

其中“Image”是待生成泡泡的父体,调整其尺寸(50,1000),位置(0,500,0)

Unity2D——捕鱼,炮台锁定辅助线

创建一个脚本,CSDN.cs,并添加到“Paotai”对象上,如图所示

Unity2D——捕鱼,炮台锁定辅助线

其中“paopao”是Resources中的预制体,代码如下:

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

public class CSDN : MonoBehaviour {

    Vector3[] Pos;
    public GameObject Prefab;//鱼
    public GameObject PaopaoParent;//泡泡父体
    bool _move = false;//鱼儿是否可移动
    public GameObject paopao;//泡泡预制体
    List<GameObject> paopaonum = new List<GameObject>();
    int oldnum = 0;//目前已显示的泡泡数
    void Start()
    {
        for (int i = 0; i < 20; i++)//生成连线中的泡泡
        {
            GameObject go = GameObject.Instantiate(paopao) as GameObject;
            go.transform.parent = PaopaoParent.transform;
            go.transform.localScale = Vector3.one;
            go.transform.localPosition = new Vector3(0, -500 + 80 * (i + 1), 0);
            go.gameObject.SetActive(false);
            paopaonum.Add(go);
        }
    }
    void Update()
    {
        if (_move)
        {
            Vector3 lookDirect = Pos[1] - Prefab.transform.position;
            Quaternion oldQ = Quaternion.LookRotation(Vector3.forward, lookDirect);
            float oldz = oldQ.eulerAngles.z;
            Prefab.transform.eulerAngles = new Vector3(0, 0, oldz);//修改鱼儿游动方向
            Prefab.transform.position = Vector3.MoveTowards(Prefab.transform.position, Pos[1], 50 * Time.deltaTime);//鱼儿移向目标位置
            MovePaopao(this.transform.position, Prefab.transform.position);//显示和隐藏相对泡泡个数
        }
    }

    public void OnButton(int index)
    {
        switch (index)
        {
            case 0:
                Pos = new Vector3[2];
                for (int i = 0; i < 2; i++)//随机生成鱼儿可移动的初始位置及目标位置
                {
                    int _x = Random.Range(-300, 300);
                    int _y = Random.Range(-600, 300);
                    Pos[i] = new Vector3(_x, _y, 0);
                }
                Prefab.transform.position = Pos[0];
                _move = true;//可移动
                break;
        }
    }
    void MovePaopao(Vector2 v1, Vector2 v2)//v1炮台位置,v2鱼的位置
    {
        float dis = Vector2.Distance(v1, v2);
        float num = Mathf.Floor(dis / 80);//取整,舍去小数点后数字
        Vector2 targetDir = v2 - v1;
        float fireangle = Vector2.Angle(targetDir, Vector3.up);
        if (v2.x > v1.x)
        {
            fireangle = -fireangle;
        }
        this.transform.eulerAngles = new Vector3(0, 0, fireangle);//根据鱼儿位置更改炮台指向角度
        if (oldnum != (int)num)
        {
            if (oldnum < (int)num)//当鱼儿游向远处时,显示泡泡
            {
                for (int i = oldnum; i < (int)num; i++)
                {
                    paopaonum[i].gameObject.SetActive(true);
                }
            }
            else if (oldnum > (int)num)//当鱼儿游向近处时,隐藏泡泡
            {
                for (int i = (int)num; i < oldnum; i++)
                {
                    paopaonum[i].gameObject.SetActive(false);
                }
            }
            oldnum = (int)num;
        }
    }
}

对“Button”的设置

Unity2D——捕鱼,炮台锁定辅助线

1:选择“Button”对象,点击“+”,2:将“Paotai”对象拖入2中,3:选择CSDN中的Button(),4:设置为0;