Five-unity3D火箭鼠小游戏
发布时间
阅读量:
阅读量
游戏今天已经可以正常运行了,在当前状态下仍存在以下问题:① 激光未被关闭;② 飞鼠下落的状态并非属于fall类型;③ 包含"!"类型的错误提示信息
新内容:
飞鼠的死亡机制:当飞鼠遇到障碍物时会自动结束游戏(图片-动画)
奖励机制:游戏内会随机放置积分(图层、脚本编写)
积分记录功能:游戏界面右上方显示玩家获得的所有积分数量(GUI、文字美化)
感想:今天是补课的最后一天,一个跑酷类小游戏已经基本完成。如果将时间集中投入开发的话大概需要一两天的时间。
详细分析:
1.animator界面的操作和逻辑分析
比如新增变量die,fall后怎么连线呢?

连线后的设置不是按钮!而是点击线条!具体逻辑看你了

关键点1,下图勾上 碰撞体才能被检测到

关键点2,下面增加的变量是为了控制die,注意执行前要选中!选中!

关键点3,暂时不知道什么问题了,但是你经常忘记设置这里:

游戏世界中光束和宝物会以随机的方式出现(类似于一个永无止境的空间体验),因此开发团队建议参考相关的代码库以实现类似效果。
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 says
void 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 是金币的尺寸啥的。
为了使用户界面直观且易于使用,在游戏框外设置一个金币统计行是必要的。它不仅需要一个图形界面(GUI),还需要确保其设计美观且功能完善。通常情况下是绑定到鼠标的。
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 run
public 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);//判断碰到的碰撞体是金币,则
else
HitbyLaser(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.8
AdjustJetPack(ForceActive);//粒子的代码 +实参
}
}
全部评论 (0)
还没有任何评论哟~
