捕鱼达人(unity实现)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43701019/article/details/99298681

——个人笔记

  • 这个是在画布下(Canva)实现的,会涉及到一些层次问题。如果要素材的话可以到:
  • 链接:https://pan.baidu.com/s/1wcXVVs-4865rAw3vHrqSag
    提取码:ip38

  • 武器

    • 武器实现就是根据鼠标的移动而选择,点击就发射,鼠标滑轮(或者按钮)可以更换武器。
    • 武器旋转:可以参考我写的:多种武器旋转方式
    • 武器射击:点击左键就发射这个我也写过类似的就不重复了,可以参考:unity实现类似元气骑士的游戏的文章里面的远程攻击就有详细讲解,不过子弹碰撞到物体不仅销毁子弹,而且在销毁前要在碰撞位置生成网。还有一点小细节不同就是,在点击UI的时候是不发射子弹的(比如点击更改武器的按钮不能触发发射子弹的操作)。如下:
    //开头要引入  using UnityEngine.EventSystems;
    if(EventSystem.current.IsPointerOverGameObject == false && Input.GetMouseButton(0))
    {
    	//TODO 实例化子弹
    }
    

    第一个是如果按到了UI那么这个就会返回true,所以当没有按到UI时就会返回false,这样就行了!不过你试了一下的话,还是有bug的,因为背景也是UI,还要有一步操作,把背景的游戏物体UI的触发(Raycast Target)勾选掉,如果把那个√ 取消
    在这里插入图片描述

    • 更换武器:添加一个按钮,再添加点击事件就行了,如果要加上鼠标滑轮也能控制,那么 看代码:
    if(Input.GetAxis("Mouse ScrollWheel") < 0)
    {
    	//TODO 更换武器
    }
    

    这个是检测滑轮的值滑轮向下滑为负,向上为正。有点像Horizontal(检测左右按键)和Vertical(检测上下按键)。

  • 鱼儿快活地游

    • 鱼儿生成可以在屏幕外的四周的位置,就是在四周加空物体(就是生成的位置),这个位置可以自己喜欢设定,根据自己喜好,而且把空物体的红线(X轴,transfrom.right)向指向屏幕中心,那样我们生成的鱼(因为我的鱼的预制体的前方向就是自身的X轴方向)位置和旋转就跟空物体一致就行了。比如:
      在这里插入图片描述
    • 然后写自动前进和自动转弯的脚本,控制鱼儿生成的脚本和鱼儿的属性。就这三步我们的鱼儿就初步可以行走了,前进脚本是最简单的,我们从这里入手。
    • 前进脚本:
    public class AutoMove : MonoBehaviour {
    	[HideInInspector]
        public float speed = 30.0f;//其实可以不用默认值,因为每个鱼都要传这个值进来
        [HideInInspector]
        public Vector3 dir=Vector3.right;
    
        
        void Update()
        {	         
            transform.Translate(dir * speed * Time.deltaTime);//默认是自身坐标,所以dir为(1,0,0)就是红线。
        }
    }
    
    
    • 转弯脚本:
    public class AutoRotate : MonoBehaviour
    {
        public float speed = 10f;
    
        void Update()
        {
            transform.Rotate(Vector3.forward, speed * Time.deltaTime);
        }
    }
    
    • 生成鱼儿的脚本和鱼儿的属性就要一起讨论的,我们要鱼儿有些直行有些会转弯,而且直行的方向也有不同,还要有间隔的生成多条鱼,根据这些我们能够写一个鱼儿的脚本(先定义属性,最大生成数量和最大速度)
    public class FishAttr : MonoBehaviour
    {
        //public int hp;//这个伤害的时候才用到现在不用
        
        public int maxNum;//最大生成数量
        public int maxSpeed;//最大速度
    	
        private void OnTriggerEnter2D(Collider2D collision)
        {
        		//这个我也直接在着直接放上来了,主要懒得写太多,
        		//在屏幕外加一个更加大的边框,加上tag和触发器。
            if (collision.tag == "Border")
            {
                Destroy(gameObject);
            }
        }
    
        void TakeDamage(int value)
        {
        	//伤害这里就不讲了,网触发器有鱼进入就通知鱼儿执行这个函数
        	//用SendMessage("函数名",参数····)
        }
    }	    
    
    • 控制鱼儿生成的(这里用了协程,如果不懂的百度一下哦):
    public class FishMaker : MonoBehaviour
    {
        public Transform fishHolder;//鱼儿实例放的位置
        public Transform[] genPositions;//鱼儿生成的位置
        public GameObject[] fishPrefabs;//鱼儿prefabs
    
        public float fishGenWaitTime = 0.5f;//生成同种鱼儿的间隔
        public float waveGenWaitTime = 0.3f;///每次生成鱼儿的间隔
    
        void Start()
        {
            InvokeRepeating("MakeFishes", 0, waveGenWaitTime);
        }
    
        void MakeFishes()
        {
            int genPosIndex = Random.Range(0, genPositions.Length);
            int fishPreIndex = Random.Range(0, fishPrefabs.Length);
            int maxNum = fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxNum;
            int maxSpeed = fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxSpeed;
            //不从0开始的原因是我们生成鱼儿小的生成多,大的生成小,+1为了保证大的鱼能生成1条
            int num = Random.Range((maxNum / 2) + 1, maxNum);
            //速度也是为了不要同种鱼儿速度相差太大
            int speed = Random.Range(maxSpeed / 2, maxSpeed);
            int moveType = Random.Range(0, 2);      //0:直走;1:转弯
            int angOffset;                          //仅直走生效,直走的倾斜角
            int angSpeed;                           //仅转弯生效,转弯的角速度
    
            if (moveType == 0)
            {
                angOffset = Random.Range(-22, 22);
                StartCoroutine(GenStraightFish(genPosIndex, fishPreIndex, num, speed, angOffset));
            }
            else
            {
                if (Random.Range(0, 2) == 0)        //是否取负的角速度
                {
                    angSpeed = Random.Range(-15, -9);
                }
                else
                {
                    angSpeed = Random.Range(9, 15);
                }
                StartCoroutine(GenTrunFish(genPosIndex, fishPreIndex, num, speed, angSpeed));
            }
        }
    
        IEnumerator GenStraightFish(int genPosIndex,int fishPreIndex,int num,int speed,int angOffset)
        {
            for (int i = 0; i < num; i++)
            {
                GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);
                fish.transform.SetParent(fishHolder, false);
                fish.transform.localPosition = genPositions[genPosIndex].localPosition;
                fish.transform.localRotation = genPositions[genPosIndex].localRotation;
                fish.transform.Rotate(0, 0, angOffset);
                fish.GetComponent<SpriteRenderer>().sortingOrder += i;//防止位置重叠(每种鱼基础间隔预留一些)
                fish.AddComponent<AutoMove>().speed = speed;
                yield return new WaitForSeconds(fishGenWaitTime);
            }
        }
    
        IEnumerator GenTrunFish(int genPosIndex, int fishPreIndex, int num, int speed, int angSpeed)
        {
            for (int i = 0; i < num; i++)
            {
                GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);
                fish.transform.SetParent(fishHolder, false);
                fish.transform.localPosition = genPositions[genPosIndex].localPosition;
                fish.transform.localRotation = genPositions[genPosIndex].localRotation;
                fish.GetComponent<SpriteRenderer>().sortingOrder += i;;//防止位置重叠
                fish.AddComponent<AutoMove>().speed = speed;
                fish.AddComponent<AutoRotate>().speed = angSpeed;
                yield return new WaitForSeconds(fishGenWaitTime);
            }
        }
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_43701019/article/details/99298681
今日推荐