首页 > 其他分享 >Unity初始界面设计与人物移动代码

Unity初始界面设计与人物移动代码

时间:2023-01-07 20:45:17浏览次数:85  
标签:界面设计 anim void jump Unity rb SetBool public 初始

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

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

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

相关文章