前言
- 看到了个不错的unity3D游戏教程,于是记录一下
- 这是工程地址+游戏Demo
1.准备游戏材质
-
工具使用PS
-
剪切这么几个不同颜色的圆环,切开 (注意要PNG格式的哦)
-
准备一个红旗 (注意要PNG格式的哦)
2.进入编辑器,处理四色环的逻辑
- 来到unity中,对我们准备好的png照片进行分割
- 在这里切割哦,完成后点apply
- 切好之后,将换的4个部分放到场景中,用一个父物体装着,并且调整好位置,使转动父物体的Z轴,环也能正常绕中心点转动!
- ok接下来我们写个脚本,让这个环在游戏开始的时候就以一定的速度转起来(100的角速度)之后环就可以转动了!
/// <summary>
/// 圈转动
/// </summary>
public class Rotator : MonoBehaviour
{
public float rotateSpeed = 100f;
private void Update()
{
//每秒转100度
transform.Rotate(0f,0f,rotateSpeed*Time.deltaTime);
}
}
- 因为涉及到小球碰撞环的逻辑,因此需要给四个环都上一个碰撞器组件,因为的不规则物体,所以上一个多边形的碰撞器
- 这样一个关卡就差不多完成了(除了还没有上tag~)
3.玩家控制小球逻辑
-
新建一个2DObject的小球,并且Sprite选择一个Knob
-
因为小球需要收到模拟的重力作用,因此给一个Rigibody,重力设置为3,并且锁定其x和z轴的运动,只让其在Y轴进行运动
-
因为要考虑到与环的碰撞,因此给其来一个碰撞器,选中Is Trigger,这样即使碰撞到了,小球不会被弹开,会穿过,但是不影响碰撞的回调
-
接下来我们来写小球的脚本
-
首先写一个小球跳跃的逻辑,当点击鼠标左键,或者空格,小球向上跳跃~并且第一次跳跃前设置重力为0,开始游戏后,小球重力规模设置为3.
private void Update()
{
if (Input.GetButton("Jump") || Input.GetMouseButtonDown(0))
{
if (firstBegin)
{
rb.gravityScale = 3;
firstBegin = false;
}
rb.velocity = Vector2.up * jumpForce;
}
}
- 关于小球碰撞后的回调方法OnTriggerEnter2D,如果碰到的是tag为color changer的物体就改变颜色,然后将碰到的物体销毁(这个color changer其实就是一个隐藏起来的物体,用来让小球穿过一个环之后更改颜色的);如果碰到了和当前颜色不同的颜色环,那么记作游戏失败,重新加载场景(也就是回到起点)
private void OnTriggerEnter2D(Collider2D col)
{
//碰撞的对象col
if (col.CompareTag("color changer"))
{
SetRandomColor();
Destroy(col);
return;
}
if (!col.CompareTag(currentColor))
{
//回到出生点
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
if (col.CompareTag("win point"))
{
SceneManager.LoadScene("Win");
}
}
-
大概放在这个位置,这样小球碰到就可以更改颜色!(当然这个color changer也需要一个碰撞器,用来检测)
-
环形的四部分也需要分别按照颜色名,上一个不同的Tag,用于和小球当前的颜色进行对比。
-
关于生成颜色的方法如下:使用随机数,给小球当前颜色赋值。
private void SetRandomColor()
{
int index = Random.Range(0, 4);
switch (index)
{
case 0:
currentColor = "bule";
sr.color = blueColor;
break;
case 1:
currentColor = "yellow";
sr.color = yellowColor;
break;
case 2:
currentColor = "pink";
sr.color = pinkColor;
break;
case 3:
currentColor = "purple";
sr.color = purpleColor;
break;
}
}
- 再给终点的红旗一个碰撞体,并且给一个Tag给它,用来检测是否游戏胜利,胜利的话专门加载一个胜利的场景!
- 记得将这个场景放入Build Setting中,不然加载不出来哦
这样Player部分就完成啦!Player的完整代码如下:
/// <summary>
/// 小球跳动
/// </summary>
public class Player : MonoBehaviour
{
public float jumpForce = 10f;
public Rigidbody2D rb;
public string currentColor;
public SpriteRenderer sr;
public Color blueColor;
public Color yellowColor;
public Color pinkColor;
public Color purpleColor;
private bool firstBegin = true;
private void Start()
{
SetRandomColor();
rb.gravityScale = 0;
}
private void SetRandomColor()
{
int index = Random.Range(0, 4);
switch (index)
{
case 0:
currentColor = "bule";
sr.color = blueColor;
break;
case 1:
currentColor = "yellow";
sr.color = yellowColor;
break;
case 2:
currentColor = "pink";
sr.color = pinkColor;
break;
case 3:
currentColor = "purple";
sr.color = purpleColor;
break;
}
}
private void Update()
{
if (Input.GetButton("Jump") || Input.GetMouseButtonDown(0))
{
if (firstBegin)
{
rb.gravityScale = 3;
firstBegin = false;
}
rb.velocity = Vector2.up * jumpForce;
}
}
private void OnTriggerEnter2D(Collider2D col)
{
//碰撞的对象col
if (col.CompareTag("color changer"))
{
SetRandomColor();
Destroy(col);
return;
}
if (!col.CompareTag(currentColor))
{
//回到出生点
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
if (col.CompareTag("win point"))
{
SceneManager.LoadScene("Win");
}
}
}
4.关于摄像机部分
- 小球一直上跳,当小球的高度高于摄像机时,摄像机应该跟随小球的y值进行上移动,因此再给摄像机一个这样的脚本,我们的游戏就完成了!
public class followPlayer : MonoBehaviour
{
public Transform playerTransform;
private void Update()
{
if (playerTransform.position.y > transform.position.y)
{
transform.position = new Vector3(transform.position.x, playerTransform.position.y, transform.position.z);
}
}
}