版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
——个人笔记
- 这个是在画布下(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); } } }
- 鱼儿生成可以在屏幕外的四周的位置,就是在四周加空物体(就是生成的位置),这个位置可以自己喜欢设定,根据自己喜好,而且把空物体的红线(X轴,transfrom.right)向指向屏幕中心,那样我们生成的鱼(因为我的鱼的预制体的前方向就是自身的X轴方向)位置和旋转就跟空物体一致就行了。比如: