最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

全球最资讯丨Unity初始界面设计与人物移动代码

来源:博客园

初始界面设计的比较简洁,只有三个按键,开始游戏,设置,退出,一张背景。

本来想整一个玩家自定义按键,但是觉得太麻烦且没必要。


(资料图)

做到现在的感受就是,遇到不会的地方,网上的教程五花八门,但是只有几篇能够符合需求。所以重要的是打牢基础,然后在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();        coll = GetComponent();        anim = GetComponent();    }    // 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;    }}

关键词: 人物移动 必不可少 另一种方式