初始界面设计的比较简洁,只有三个按键,开始游戏,设置,退出,一张背景。
本来想整一个玩家自定义按键,但是觉得太麻烦且没必要。
做到现在的感受就是,遇到不会的地方,网上的教程五花八门,但是只有几篇能够符合需求。所以重要的是打牢基础,然后在API里翻想要的东西。当然,网上的视频教程也是很有用的。个人认为有些视频比文档好懂。
按键button
button是一个常用到的UI。
他有许多内置功能,如改变物体的active状态等(SetActive)。另外,当你需要让他完成其他的一些功能,也可以自写函数,挂载在上面。
创建一个空对象(我命名为GameManager,他还可以负责控制按键与界面间的关系,游戏暂停等),在他上面挂一个脚本,这个脚本里码好你要实现的功能的函数。之后把这个空对象挂到按钮的click上,选择功能。
还有一种方法是直接给按钮挂一个脚本。
关于存档
对于一个地牢2D肉鸽类游戏来说(不管对任何一款游戏来说),存档功能必不可少。如何存档捏。一种方式是将游戏的各项参数保存在一个文件里。另一种方式是将整个场景保存起来。
相对来说,前者更容易实现,但是后者更加方便,因为后者不需要一个一个配参数。
人物移动代码
- GetKeyDown一定要放到Update()里而不是FixedUpdate(),不然会导致跳跃时按键不灵敏。大概是由于Update()是按照电脑的性能来执行,FixedUpdate()则固定时间执行一次。
代码逻辑
并行
-
判断玩家是否按下跳跃键,若是,判断跳跃次数是否大于0,是则跳跃,跳跃次数减1.
-
判断玩家是否在地上,若是,重置跳跃次数。
如何判断玩家是否在地上?
用速度来判断是万万不可的,因为根据初中物理,人物到最高处时,速度也为0。
从网上学来的操作:挂一个空对象取名foot,放在人物脚的位置(注意这个对象需要从属于人物,这样才能跟随人物的移动而移动)获取foot的位置。再获取瓦片地图public LayerMask Ground;瓦片地图的层级设置为Ground(可以自命名)。之后进行碰撞判断即可
isGround = Physics2D.OverlapCircle(foot.position, 0.1f, Ground);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class playercontrol : MonoBehaviour
{
private Rigidbody2D rb;//人物钢体
private Collider2D coll;
public Animator anim;
public LayerMask Ground;
public Transform foot;
public float speed;//速度
[Header("跳跃")]
public float jumpforce;
public bool isGround;
public bool jumpPressed;
public int jumpCount;
public int jump_max;
// public Text scorenum;
void init()
{
jump_max = 2;
isGround = true;
jumpPressed = false;
speed = 15f;
jumpforce = 15f;
}
// Start is called before the first frame update
void Start()
{
init();
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<Collider2D>();
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown("k"))
{
jumpPressed = true;
anim.SetBool("jump", true);
}
}
private void FixedUpdate()
{
Jump();
Movement();
}
void Movement()
{
float horizontalmove = Input.GetAxisRaw("Horizontal");//获取速度
rb.velocity = new Vector2(horizontalmove * speed, rb.velocity.y);//移动
anim.SetBool("run", false);
if (Input.GetAxisRaw("Horizontal") != 0)
anim.SetBool("run", true);
if (horizontalmove != 0)
{
if (horizontalmove < 0)
transform.localScale = new Vector3(1, 1, 1);//转向
else
transform.localScale = new Vector3(-1, 1, 1);//转向
}//转向
}
void Jump()
{
anim.SetBool("jump", false);
isGround = Physics2D.OverlapCircle(foot.position, 0.1f, Ground);
if (isGround)
{
anim.SetBool("jump", false);
jumpCount = jump_max;
}
else
anim.SetBool("jump", true);
if (jumpPressed && jumpCount > 0)
{
rb.velocity = new Vector2(rb.velocity.x, jumpforce);
jumpCount--;
}
jumpPressed = false;
}
}
标签:界面设计,anim,void,jump,Unity,rb,SetBool,public,初始
From: https://www.cnblogs.com/huaziqi/p/17033509.html