人物跳跃利用空格键(jump)首先判断人物是否在跳板上
Bool isonPlateForm=false默认为不在跳板上,首先通过键盘得到jump
Input.GetButtonDown("Jump")
制作跳板代码解析 :
先制作预制件
public Transform prefab;制作预制件
public Material[] mats;材质球数组
public PhysicMaterial[] phyMats;物理材质数组 摩擦力、弹力
public int gameObjectNumber;定义对象数量(只能是整形)
public Vector3 minSize, maxSize, minGap, maxGap;三维尺寸最小最大,Gap是一个上限与下限的距离
Queue<Transform> queueObjects;队列对象
Vector3 nextPosition;下一个位置
public Vector3 startPosition;起始位置
public int minY, maxY;上下跳动最小与最大
public float offset;定义一个切换点
public Transform rushInPrefab;冲刺预制件
public Vector3 minrushInInititionPosition;最小冲刺位置
public Vector3 maxrushInInititionPosition;最大冲刺位置
public Transform boostPrefab;能量豆预制件
public Vector3 minboostPosition;最小位置
public Vector3 maxboostPosition;最大位置
void Start()产生跳板
{
queueObjects = new Queue<Transform>(gameObjectNumber);数量
for (int i = 0; i < gameObjectNumber; i++)
{
queueObjects.Enqueue((Transform)GameObject.Instantiate(prefab));把预制件添加到队列对象中
}
nextPosition = startPosition;
for (int i = 0; i < gameObjectNumber; i++)
{
Recycle();
}
}
void Update()
{
if (RunnerScript.distance - queueObjects.Peek().position.x >= offset)当运动距离减去相对起始位置大于等于预定的距离时,连续产生跳板
{
Recycle();
}
}
int index;索引定义
void Recycle()方法
{
Vector3 scale = new Vector3(Random.Range(minSize.x, maxSize.x), 1, 1);初始化三维坐标x随机
Vector3 position = nextPosition;
position.x += scale.x * 0.5f;
position.y += scale.y * 0.5f;
Transform o = queueObjects.Dequeue();移出队列
o.localScale = scale;
o.localPosition = position;
index = Random.Range(0, mats.Length);随机产生材质球
o.renderer.material = mats[index];给材质球添加各个参数renderer渲染器
o.collider.material = phyMats[index];collider碰撞机物理材质碰撞
nextPosition += new Vector3(Random.Range(minGap.x, maxGap.x) + scale.x, Random.Range(minGap.y, maxGap.y), 0);起始和末尾切换x的值是+=累积的和
if (nextPosition.y > maxY)判断高度
{
nextPosition.y = maxY - maxGap.y;达到最高就减去缓冲值使在最大和最小的范围内跳动
}
else if (nextPosition.y < minY)
{
nextPosition.y = minY - minGap.y;达到最低减去最小值达到合适范围
}
queueObjects.Enqueue(o);把跳板添加到队列
if (!RunnerScript.isRush && Random.Range(0, 100) % 3 == 0 && !rushInPrefab.gameObject.activeSelf && RunnerScript.distance > 30)判断没有冲刺并且有百分之33.3的几率并且不是冲刺预制件的对象的自身活动并且距离大于30
{
rushInPrefab.gameObject.SetActive(true);设置冲刺预制件为开始
rushInPrefab.position = o.position + new Vector3(Random.Range(minrushInInititionPosition.x, maxrushInInititionPosition.x), Random.Range(minrushInInititionPosition.y, maxrushInInititionPosition.y), 0);冲刺预制件的位置,x,y都随机,z不变
}
if (!RunnerScript.isRush && Random.Range(0, 100) % 1 == 0 && !boostPrefab.gameObject.activeSelf && RunnerScript.distance > 30)能量豆出现的概率1能量豆不在跳板上
{
boostPrefab.gameObject.SetActive(true);产生为真
boostPrefab.position = o.position + new Vector3(Random.Range(minboostPosition.x, maxboostPosition.x), Random.Range(minboostPosition.y, maxboostPosition.y), 0);设置能量豆的位置
}
}
}
冲刺的代码解析
using UnityEngine;
using System.Collections;
public class RushInScript : MonoBehaviour
{
public Material[] mats;材质球数组
float rate;定义速率
float time;定义时间
// Use this for initialization
void Start()
{
rate = 1.0f / mats.Length;每秒出现界面的速率
}
int index;
// Update is called once per frame
void Update()
{
time += Time.deltaTime;
if (time >= rate)如果所用时间大于速率就把时间清零
{
time = 0;
index = index == mats.Length - 1 ? 0 : index + 1;产生
renderer.material = mats[index];
}
if (RunnerScript.distance - transform.position.x > offset)
{
gameObject.SetActive(false);
}
}
public float offset;
void OnTriggerEnter(Collider other)触发器
{
RunnerScript.isRush = true;
RushScript.isRush = true;
gameObject.SetActive(false);
}
}