本文主要是介绍Five-unity3D火箭鼠小游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天的游戏可以玩了,仍存在的问题:
1.激光不关闭
2.飞鼠下落状态并不是fall
3.有“!”错误提示
新内容:
1.飞鼠的死亡模式:碰到障碍物会死亡(图片-动画)
2.奖励模式:金币的随机放置(图层、脚本编写)
3.记录模式:屏幕角上记录获取到的金币数量(GUI、文字美化)
感想:今天是补课的倒数第二天,一个跑酷类小游戏已经大体成型,想了想如果把时间挤在一起做的话大概需要个一两天吧。
详细分析:
1.animator界面的操作和逻辑分析
比如新增变量die,fall后怎么连线呢?
连线后的设置不是按钮!而是点击线条!具体逻辑看你了
关键点1,下图勾上 碰撞体才能被检测到
关键点2,下面增加的变量是为了控制die,注意执行前要选中!选中!
关键点3,暂时不知道什么问题了,但是你经常忘记设置这里:
2.激光和金币的随机出现(像无穷无尽的房间一样~所以代码可以借鉴)
以下是控制本游戏中需要随机出现的上述三者 完整代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Room : MonoBehaviour {public GameObject[] availableRooms; //数组变量 public List<GameObject> currentRooms; //list是链表,GameObject是一种类,currentRooms是当前房间private float screenWidthInPoints;//is当前屏幕的宽度//以下随机金币public GameObject[] avaliableCoins;public List<GameObject> coins;public float objectsMinDistance = 5.0f; //随机创建的一坨金币群的 水平方向的最小和最大距离public float objectsMaxDistance = 10.0f;public float objectsMinY = -1.4f ; //金币群的最大、最小高度public float objectsMaxY = 1.4f ;public float objectsMinRaotation = -45.0f; //金币群的旋转幅度public float objectsMaxRaotation = 45.0f;//以上void Start () {float height = 2.0f * Camera.main.orthographicSize;//获取当前视图范围的高度screenWidthInPoints = height * Camera.main.aspect; //以上获取了长宽比 ,注意都是针对屏幕而不是背景图尺寸什么的} //当前屏幕的宽度 --he saysvoid addCoins(float lastObjectX) //金币位置{int randomCoinIndex = Random.Range(0,avaliableCoins.Length);GameObject coin = (GameObject)Instantiate(avaliableCoins [randomCoinIndex]);float coinPositionX = lastObjectX + Random.Range(objectsMinDistance,objectsMaxDistance);float randomY = Random.Range(objectsMinY,objectsMaxY );coin.transform.position = new Vector3 (coinPositionX,randomY,0);float rotation = Random.Range(objectsMinRaotation,objectsMaxRaotation);//rotation定旋转角度coin.transform.rotation = Quaternion.Euler(Vector3.forward*rotation);coins.Add(coin);}void IsGeneratorCoinsAndLaser()//金币和激光 {List<GameObject> DeleteCoinsAndLaser = new List<GameObject>();//保存将要删掉的//bool addRooms = true;//判断是否增加float playerX = transform.position.x;//获取飞鼠的位置的X轴float DeleteCoinsAndLaserX = playerX - screenWidthInPoints;//坐标计算float AddCoinsAndLaserX = playerX + screenWidthInPoints;float farCoinsAndLaserIndex = 0;foreach(var coin in coins) //var:任何 (对于任何在coins 里面的coin{float coinX = coin.transform.position.x; //定义coinX来获取当前X轴坐标farCoinsAndLaserIndex = Mathf.Max(farCoinsAndLaserIndex,coinX);//返回最大值if (coinX < DeleteCoinsAndLaserX) //判断当前获取的金币的X轴位置DeleteCoinsAndLaser.Add(coin);}foreach(var coin in DeleteCoinsAndLaser) {coins.Remove (coin);Destroy (coin); //这几处理是 因为不能直接删原来的链表}if (farCoinsAndLaserIndex < AddCoinsAndLaserX) //判断是否需要增加金币了addCoins(farCoinsAndLaserIndex);}void addRoom(float farRoomID)//farRoomID最远的房间,也就是最右侧的,对应着,同时删除的当然也就是最左边的{int randomRoomIndex = Random.Range(0,availableRooms.Length); //确定了room的选择范围GameObject room = (GameObject)Instantiate(availableRooms [randomRoomIndex]);float roomWidth = room.transform.FindChild("floor").localScale.x;//当前房间的宽度..//FindChild子。。"floor"和你的具体重命名一致float roomCenter = roomWidth * 0.5f + farRoomID; //中心点roomCenter = roomWidth * 0.5f一般是它房间的一半。+ farRoomID是另外一个房间多出来的部分room.transform.position = new Vector3 (roomCenter,0,0);//定义房间,然后拿上面值来用currentRooms.Add(room);} void IsGeneratorRoom(){List<GameObject> DeleteRoom = new List<GameObject>();//保存将要删掉的房间bool addRooms = true;//判断是否增加房间float playerX = transform.position.x;//获取飞鼠的位置的X轴float DeleteRoomX = playerX - screenWidthInPoints;//坐标计算float AddRoomX = playerX + screenWidthInPoints;float farRoomIndex = 0;foreach (var room in currentRooms)//判断哪些房间需要删除{float roomWidth = room.transform.FindChild("floor").localScale.x;float roomStartX = room.transform.position.x - roomWidth * 0.5f;float roomEndX = roomStartX + roomWidth;//下面是判定的核心环节 (用if语句: if(roomStartX > AddRoomX) addRooms = false;if(roomEndX < DeleteRoomX) DeleteRoom.Add(room);farRoomIndex = Mathf.Max(farRoomIndex,roomEndX); //知道了新增加的房间的需要的长度}foreach (var room in DeleteRoom){currentRooms.Remove(room); Destroy(room);}if (addRooms){addRoom(farRoomIndex);}}void FixedUpdate(){IsGeneratorRoom();IsGeneratorCoinsAndLaser();}void Update () { }
}
栏内设置:
Script 脚本
序号1“所有房间”,随着所需点击更改Size值,控制着Element会出现多少个,然后可以把预制件房间拉进去了。
序号2“当前金币”,从脚本可以看出金币和其他类似物件可以通用代码(比如激光就直接拉进去了),因此只需更改Size,
比如Size=2,下面出现了Element0,Element1,分别把对象金币和激光拖进去。如果你想要其他装饰品,可以直接更改Size再加入,简单易行。
Coins 是金币的尺寸啥的。
3.游戏框外的金币统计行
对用户可见的当然需要GUI咯,主要是一些美观,绑定在哪个对象?自然也是mouse
以下是mousecontrol脚本全部代码:
using UnityEngine;
using System.Collections;public class mousecontrol : MonoBehaviour {public float jetpackFore = 75.0f; //定义一个力public float movespeed = 5.0f;public Transform groundCheckTransform; //+存储刚才创建的黄色新private bool grounded; //判断是否落地public LayerMask groundCheckLayerMask;//保存...Animator animator;//创建一个新动画 /以上fly and runpublic ParticleSystem jetpack;public Texture2D coinIocn; //保存硬币图标private bool dead = false;//飞鼠死亡private uint coins = 0;void Start () {animator = GetComponent<Animator>(); //对它进行初始化操作}void Update () {}void OnGUI(){DisplayCoin ();}//收集金币数量void CollectCoin(Collider2D collider)//碰撞体做形参,Collider2D:二维碰撞体{coins++;Destroy(collider.gameObject); //吃掉的金币在屏幕上消失}void DisplayCoin(){Rect coinIconRect = new Rect (10,10,32,32);//定义一个矩形,写下位置GUI.DrawTexture (coinIconRect,coinIocn);GUIStyle style = new GUIStyle();style.fontSize = 30;style.fontStyle = FontStyle.Bold;style.normal.textColor = Color.yellow;Rect LabelRect = new Rect (45,10,60,32);GUI.Label(LabelRect,coins.ToString(),style);}//以下控制死亡void HitbyLaser(Collider2D laserCollider){dead = true;animator.SetBool("dead",dead);}//以上void OnTriggerEnter2D(Collider2D collider) //激光碰撞体和飞鼠的圆形碰撞体{//以下金币if (collider.gameObject.CompareTag("Coins")) //CompareTag匹配,多少个种类碰撞体就用多少个CompareTag,CollectCoin (collider);//判断碰到的碰撞体是金币,则elseHitbyLaser(collider);//如果不是金币,则是激光,就要执行其他}void UpdateGroundedStatus()//更新老鼠状态/是否落地{grounded = Physics2D.OverlapCircle(groundCheckTransform.position,0.1f,groundCheckLayerMask);//OverlapCircle专门用来做碰撞检测的 //0.1f意半径0.1f的圆animator.SetBool("grounded",grounded);//来获取bool变量的额名字,注意符合一致}void AdjustJetPack(bool jetPackActive){jetpack.enableEmission =!grounded;//jetpack.emissionRate = jetPackActive? 300.0f:75.0f;//可略,燃料启动过程,注释后就不会再空中断火了,可是渐渐地过程还在么?改天自己测试}void FixedUpdate() //区别:上者不是按照固定时间间隔,而这个是。{bool ForceActive = Input.GetKeyDown(KeyCode.W);//设置鼠标操作,所以定义一个布尔型bool ForceActive1 = Input.GetKeyDown(KeyCode.D);bool ForceActive2 = Input.GetKeyDown(KeyCode.A);ForceActive = ForceActive && !dead; //判定飞鼠活着的状态下点击WAD键盘才能有用if (ForceActive){GetComponent<Rigidbody2D>().AddForce(new Vector2(0,jetpackFore));//Rigidbody2D是与你首页增加的那个钢体名字一致,这是操作钢体的}if (!dead)//判定死亡后就不再能够前进后退{if (ForceActive1){Vector2 newVelocity = GetComponent<Rigidbody2D>().velocity; //想要人物动也就是钢体动,所以获取钢体newVelocity.x = movespeed;GetComponent<Rigidbody2D>().velocity = newVelocity;}if (ForceActive2){Vector2 newVelocity = GetComponent<Rigidbody2D>().velocity; //想要人物动也就是钢体动,所以获取钢体newVelocity.x = - movespeed;GetComponent<Rigidbody2D>().velocity = newVelocity;}}UpdateGroundedStatus();//飞走的代码+执行1.8AdjustJetPack(ForceActive);//粒子的代码 +实参}
}
这篇关于Five-unity3D火箭鼠小游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!