基础tips之前博文有。
先看题目:
思路:
数组中的数,我们用方块代替,【2,3,1,1,4】就是第一个位置两个方块,第二个位置就是3个方块,以此类推。
题目中的“你”用球代替,也就是球在一个个方块上跳跃的游戏,但是什么时候游戏获胜,什么时候游戏失败呢?
上个问题的关键在于,当你落在0的时候,你永远不可能到达最后一位,也就是你永远不可能获胜,还原成Unity问题就是,当一个球落在没有方块的地面上的时候,游戏失败(返回false),那么我们抓住这点就可以开始做了,因为是只需要达到将算法过程变成更好理解的方式,也就是如果你不想在大脑中想象数组从第0位跳到第1位的过程.
那就打开这个游戏,"原力就会与你同在"(doge)
演示:
获胜:
失败:
源码:
SphereJump类
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SphereJump : MonoBehaviour
{
[SerializeField]
public Transform[] transforms;//记录九个位置的trs组,记得在Unity中赋值
public int step;//输入的步数
public GameObject Sphere;//球
public GameObject Text_1;//最大步数文本
public Button m_QueDingBtn;//确定按钮
private int curSetp;//当前步数
private int nums_1;//在数组中的位置
//public bool ground;
void Awake()
{
CreateNums();
curSetp = 0;
nums_1 = 0;
//ground = true;
}
void Start()
{
CaculateMaxStep(0);
m_QueDingBtn.onClick.AddListener(CaculateStep);//处理确定按钮监听
}
void Update()
{
SuccessOrFail();
}
#region 实现空格控制球体跳跃(需要的可以自己取消注释)
//public void FixedUpdate()
//{
// if (Input.GetKeyDown(KeyCode.Space))
// {
// if (ground == true)
// {
// transform.Translate(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")));
// GetComponent<Rigidbody>().velocity += new Vector3(0, 10, 0);
// GetComponent<Rigidbody>().AddForce(new Vector3(0, 800, 0));
// ground = false;
// }
// DestroyShpere();
// }
//}
//void DestroyShpere()
//{
// y = Sphere.transform.position.y;
// if (y >= 10)
// {
// Destroy(Sphere);
// }
//}
#endregion
/// <summary>
/// 创建随机数组
/// </summary>
public void CreateNums()
{
for (int i = 0; i < NumsManager.nums.Length; i++)
{
NumsManager.num = UnityEngine.Random.Range(0, 9);//随机数
NumsManager.numsList.Add(NumsManager.num);//列表存储随机数
};
}
/// <summary>
/// 计算步数并实现
/// </summary>
public void CaculateStep()
{
var m_Step = GameObject.Find("InputField").gameObject.transform.GetComponentInChildren<InputField>().text;//获取输入的步数
step = Convert.ToInt32(m_Step);
var m_MaxStep = GameObject.Find("01").gameObject.transform.GetComponentInChildren<Text>().text;
int nums_1 = Convert.ToInt32(m_MaxStep);
if (step<= nums_1)
{
gameObject.transform.position = transforms[curSetp + step].position;
curSetp = curSetp + step;
}
else
{
return;
}
//Text_1.GetComponent<Text>().text = "0";
CaculateMaxStep(step);
}
/// <summary>
/// 计算最大步数
/// </summary>
/// <param name="offset"></param>
public void CaculateMaxStep(int offset)
{
var text = NumsManager.numsList[nums_1+offset].ToString();//最大步数等于数组位置的数加上偏移量
nums_1 = nums_1 + offset;//实时更新在数组中的位置
Text_1.GetComponent<Text>().text = text;
}
/// <summary>
/// 判断成功还是失败
/// </summary>
public void SuccessOrFail()
{
float trsY = Sphere.transform.position.y;
var m_materials = Sphere.GetComponent<MeshRenderer>();//获得当前球的材质
//如果球的Y值等于0.5就相当于落到地面
if (trsY == 0.5f)
{
m_materials.material = (Material)Resources.Load("02");//球变红,游戏获胜
}
//如果球的位置等于trs数组第8位就变黄
if (Sphere.transform.position == transforms[8].position)
{
m_materials.material = (Material)Resources.Load("03");//球变黄,游戏失败
}
}
}
NumsManager静态类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class NumsManager
{
public static int value01;
public static int value02;
//九个位置
public static Vector3 trs01 = new Vector3(94.5f, 12.0f, 10);
public static Vector3 trs02 = new Vector3(95.5f, 12.0f, 10);
public static Vector3 trs03 = new Vector3(96.5f, 12.0f, 10);
public static Vector3 trs04 = new Vector3(97.5f, 12.0f, 10);
public static Vector3 trs05 = new Vector3(98.5f, 12.0f, 10);
public static Vector3 trs06 = new Vector3(99.5f, 12.0f, 10);
public static Vector3 trs07 = new Vector3(100.5f, 12.0f, 10);
public static Vector3 trs08 = new Vector3(101.5f, 12.0f, 10);
public static Vector3 trs09 = new Vector3(102.5f, 12.0f, 10);
public static int[] nums = new int[10];
public static int num;
public static List<int> numsList = new List<int>();
}
NumsJump类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NumsJump : MonoBehaviour
{
public GameObject Cube;
public int a;
public float m_trsY;
private Vector3 m_trs;
void Awake()
{
m_trs = gameObject.transform.position;
}
void Start()
{
//根据gameobject的名字拿数组的值
string name = gameObject.name;
switch (name)
{
case "0":
GetNumsValue(0);
break;
case "1":
GetNumsValue(1);
break;
case "2":
GetNumsValue(2);
break;
case "3":
GetNumsValue(3);
break;
case "4":
GetNumsValue(4);
break;
case "5":
GetNumsValue(5);
break;
case "6":
GetNumsValue(6);
break;
case "7":
GetNumsValue(7);
break;
case "8":
GetNumsValue(8);
break;
case "9":
GetNumsValue(9);
break;
}
NewSphere(NumsManager.value02);
a = NumsManager.value02;
}
/// <summary>
/// 实例化方块
/// </summary>
/// <param name="index"></param>
void NewSphere(int index)
{
for (int i = 0; i < index; i++)
{
GameObject.Instantiate(Cube, m_trs, Quaternion.identity);
m_trs.y += 2;
}
}
/// <summary>
/// 拿到数组的值
/// </summary>
/// <param name="index"></param>
void GetNumsValue(int index)
{
NumsManager.value02 = NumsManager.numsList[index];
}
}
项目部分截图:
具体实现逻辑,代码中的注释打的很详细了,项目完整资源已经上传,目前还在审核中,不想努力的同学可以直接下载哈,具体有什么问题可在下方评论区留言,博主空闲时间一般在周末,回复的缓慢还望见谅。