跳板游戏代码解析

本文详细解析了游戏中的跳板生成代码,包括预制件、材质、物理材质的设定,以及如何根据距离动态创建跳板。同时介绍了冲刺效果的实现,包括激活条件、位置随机化和材料切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人物跳跃利用空格键(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);

    }

}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值