Unity学习笔记:写一个控制人物移动的脚本,以及如何修复Unity对图片的压缩导致的失真【By Chutianbo】

我们先导入一个精灵资源:

这个时候Unity会自动对精灵进行压缩,导致精灵变模糊:

我们只需要解除Unity对精灵的压缩即可,办法是将精灵资源中的【注意,不是在地图里的游戏对象,而是在资源管理器中的精灵资源】压缩管理Expressing改为None,以及将过滤管理改为Point:

如何Apply即可:

由于本菜是像素爱好者,所以手上只有像素资源,高分辨的本菜不知道压缩的影响大不大;

好,那么下面是介绍如何用写一个WASD键控制人物的移动的脚本;

首先,我们给游戏对象一个空脚本King Black:

 然后敲入以下代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KingBlack : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        float Horizontal = Input.GetAxis("Horizontal");
        float Vertical = Input.GetAxis("Vertical");
        Vector2 Position = transform.position;
        Position.x += 0.01f * Horizontal;
        Position.y += 0.01f * Vertical;
        transform.position = Position;
    }
}

其中Input是命名空间UnityEngine中的一个静态类,主要负责用户的输入;

其方法GetAxis(string AxisName)的作用是获取AxisName对应的键【AxisName是什么下面本菜会介绍】返回值是float;

在这里字符串Horizontal对应的就是控制水平输入的两个键【Unity默认AD键】,以及其按下后的返回值【Unity默认A键返回-1f,D返回1f,都没有按下时返回0】的模块;

Vertical同理对应垂直方向的模块【Unity默认为WS键,W返回1f,S返回-1】;

然后用一个Vector2类【注意,这里的Vector类是指一个向量,而不像C++中vector容器类】实例化出一个对象获取游戏对象的位置,然后用返回值对其进行更改;

但是这里有一个bug,因为每个脚本的UpDate()函数是每一帧执行一次的,如果有两台电脑,一台电脑A性能差,一秒只能跑100帧率,而一台电脑B能跑200帧率,那么就是说B中的游戏世界中的时间比A中的快两倍,而我们知道,一般的游戏中游戏世界的流速是于帧率无关的,那我们怎么来修改这个bug呢? 

很简单,我们只需要用一个Time类中的deltaTime变量即可,这个变量代表的是上一帧离此刻的帧的时间差,我们将代码换优化为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KingBlack : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }


    void Update()
    {
        float Horizontal = Input.GetAxis("Horizontal");
        float Vertical = Input.GetAxis("Vertical");
        Vector2 Position = transform.position;
        Position.x += 0.1f * Horizontal*Time.deltaTime;
        Position.y += 0.1f * Vertical*Time.deltaTime;
        transform.position = Position;
    }
}

这样就可以将游戏世界在的时间流速与现实世界中的时间流速同步起来了;

当然,还可以用一个办法,即锁帧,我们固定一个脚本在单位时间内的执行次数,这样也能达到类似地效果,但是游戏世界中的时间流速并没有与现实世界中的时间流速同步。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KingBlack : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        QualitySettings.vSyncCount = 0;
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
        float Horizontal = Input.GetAxis("Horizontal");
        float Vertical = Input.GetAxis("Vertical");
        Vector2 Position = transform.position;
        Position.x += 0.1f * Horizontal;
        Position.y += 0.1f * Vertical;
        transform.position = Position;
    }
}

其中Quality Settings.vSyncCount=0;是关闭垂直同步,只有关闭了垂直同步才能锁帧【至于为什么,本菜太弱,并不知道[懒得百度]】;

Application.targetFramRate=60;是指将该脚本设置为一秒最多跑60次,即60帧【当然这得建立在你的电脑能跑60帧】

其实这些都挺简单,属于最基础的脚本;

下面来解释一下AxisName是什么;

我们需要进入Eidt->Project Settings->Input Manger中可以看到对应的选项;

 

 AxisName是一个模块的接口,当我们输入对应接口,Input.GetAxis就会关联上对应的模块,然后按照上面的定义的模块进行响应;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值