帽子接球小游戏(二)--接球的实现

    技术2023-11-08  75

     

    帽子接球小游戏(二)--接球的实现

    注:本小游戏共两章,第一章讲界面的制作,第二章讲后台代码控制接球。

    (工程中所使用到的所有图片都是我自己PS画的,比较粗糙,不太美观,能看就行,哈哈。)

    传送门:

    帽子接球小游戏(一)--制作UI面板

    资源下载:

    https://pan.baidu.com/s/1TYifaons2CQe_Iha1GqZ9g

    提取码: u3bd

    接球的实现:

    1、球的生成

    (1)新建一个空对象,命名为GameControlor,用来控制实例化球的高度。它的位置在整个面板的最上方离顶部一点距离,注意不能离视图的顶部太高,以免球下落太快来不及接。

    (2)创建一个C#脚本,命名为GameControlor,来控制球的实例化,使得球从天上一个一个掉落。

    编辑如下代码: 把编辑好的脚本挂在GameControlor上,并设置实例化的球(即boll的预制体)。

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameControlor : MonoBehaviour { public GameObject ball; //球的预制体 private float maxwidth; //最大宽度 private float time = 2; GameObject newball; //新球体 void Start () { //将屏幕宽度转换成世界坐标 Vector3 screenPos = new Vector3(Screen.width, 0, 0); Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPos); //获取球自身的宽度 float ballWidth = ball.GetComponent<Renderer>().bounds.extents.x; //计算球实例化位置的宽度 maxwidth = moveWidth.x - ballWidth; } void Update () { time -= Time.deltaTime; if (time <= 0) { //产生一个随机数,代表下一个实例化球体所需的时间 time = Random.Range(1f, 1.5f); float posX = Random.Range(-maxwidth, maxwidth); Vector3 spawnPosition = new Vector3(posX, transform.position.y, 0); //实例化球体,5秒后销毁 newball = (GameObject)Instantiate(ball, spawnPosition, Quaternion.identity); Destroy(newball, 5); } } }

    2、创建一个C#脚本,命名为HatControlor,用来控制帽子移动和接球。帽子跟随鼠标的移动在水平方向上移动,在竖直方向上保持不变。球进入帽子之后会被删除,这样帽子可以持续接收球,同时统计接到球的个数。没接住的球落在草地上,一段时间后消失。

    编辑如下代码:把该脚本挂在Hat_0上,其中effect为进球时产生的火花粒子,font为显示接球数的字体。

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class HatControlor : MonoBehaviour { public GameObject effect;//火花粒子 Vector3 rawPosition; Vector3 hatPosition; //帽子的坐标 float maxWidth; //坐标最大值 public static int sum=0; //进球数 public Font font; //字体 void Start () { //把屏幕宽度转换成世界坐标 Vector3 screenPos = new Vector3(Screen.width, 0, 0); Vector3 moveWidth = Camera.main.ScreenToWorldPoint(screenPos); //帽子的宽度 float hatWidth = GetComponent<Renderer>().bounds.extents.x; //获取帽子初始位置 hatPosition = transform.position; //计算帽子的移动宽度 maxWidth = moveWidth.x - hatWidth; } void Update () { rawPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);//把鼠标的屏幕坐标转化为世界坐标 hatPosition = new Vector3(rawPosition.x, hatPosition.y, 0);//设置帽子的位置 hatPosition.x = Mathf.Clamp(hatPosition.x, -maxWidth, maxWidth);//帽子的移动范围 GetComponent<Rigidbody2D>().MovePosition(hatPosition);//帽子移动 } void OnTriggerEnter2D(Collider2D col)//有碰撞体进入帽子触发器 { sum++;//累计进入帽子的球数 GameObject newEffect = (GameObject)Instantiate(effect,transform.position,effect.transform.rotation);//生成新的火花 newEffect.transform.parent = transform;//火花的父节点为当前物体 Destroy(col.gameObject);//销毁进入帽子的物体 Destroy(newEffect, 1.0f);//1秒后销毁火花 } void OnGUI()//统计接住球的个数 { GUIStyle style = new GUIStyle(); style.font = font; //设置字体 style.fontSize = 25; //字体大小 style.normal.textColor = Color.black; //字体颜色(黑色) //显示的位置及大小 GUILayout.BeginArea(new Rect(5, 5, 500, 100)); GUILayout.Label("接球数:" + sum, style, GUILayout.Width(200), GUILayout.Height(50)); GUILayout.EndArea(); } }

    3、蝴蝶可以停留在花上面,接下来让大雁从左边飞到右边。

    新建C#脚本,命名为SwanMove,挂在大雁上。

    编辑代码:

    using UnityEngine; public class SwanMove : MonoBehaviour { float moveSpeed = 2;//大雁飞行速度 void Start () { transform.position = new Vector3(-10, 2, 0); //大雁的初始位置 } void Update () { //如果大雁飞行的横坐标大于10,回到初始位置 if (transform.position.x > 10) transform.position = new Vector3(-10, 2, 0); else//大雁从左往右飞行 transform.Translate(Vector3.right * moveSpeed * Time.deltaTime); } }

    4、最后来看一下整体效果:

    Processed: 0.016, SQL: 9