Как изменить спрайт объекта unity

Inside the script code of the the hero(object) I want add the possibility to change its sprite. So the player hits the space button and the sprite changes into the other sprite already added to the

$begingroup$

Inside the script code of the the hero(object) I want add the possibility to change its sprite.

So the player hits the space button and the sprite changes into the other sprite already added to the project.

Can you provide me a sample code to do this?

asked Apr 1, 2014 at 3:05

Fab's user avatar

$endgroup$

1

$begingroup$

The code has been commented for you. Enjoy.

public Sprite sprite1; // Drag your first sprite here
public Sprite sprite2; // Drag your second sprite here

private SpriteRenderer spriteRenderer; 

void Start ()
{
    spriteRenderer = GetComponent<SpriteRenderer>(); // we are accessing the SpriteRenderer that is attached to the Gameobject
    if (spriteRenderer.sprite == null) // if the sprite on spriteRenderer is null then
        spriteRenderer.sprite = sprite1; // set the sprite to sprite1
}

void Update ()
{
    if (Input.GetKeyDown (KeyCode.Space)) // If the space bar is pushed down
    {
        ChangeTheDamnSprite (); // call method to change sprite
    }
}

void ChangeTheDamnSprite ()
{
    if (spriteRenderer.sprite == sprite1) // if the spriteRenderer sprite = sprite1 then change to sprite2
    {
        spriteRenderer.sprite = sprite2;
    }
    else
    {
        spriteRenderer.sprite = sprite1; // otherwise change it back to sprite1
    }
}

You need to have a sprite renderer attached to your GameObject.
Create a new C# Script and attach to it a GameObject. Paste the code in between the parenthesis… I’m sure you can figure it out from there :)

answered Apr 1, 2014 at 5:52

Savlon's user avatar

SavlonSavlon

1,0921 gold badge8 silver badges14 bronze badges

$endgroup$

3

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

$begingroup$

Inside the script code of the the hero(object) I want add the possibility to change its sprite.

So the player hits the space button and the sprite changes into the other sprite already added to the project.

Can you provide me a sample code to do this?

asked Apr 1, 2014 at 3:05

Fab's user avatar

$endgroup$

1

$begingroup$

The code has been commented for you. Enjoy.

public Sprite sprite1; // Drag your first sprite here
public Sprite sprite2; // Drag your second sprite here

private SpriteRenderer spriteRenderer; 

void Start ()
{
    spriteRenderer = GetComponent<SpriteRenderer>(); // we are accessing the SpriteRenderer that is attached to the Gameobject
    if (spriteRenderer.sprite == null) // if the sprite on spriteRenderer is null then
        spriteRenderer.sprite = sprite1; // set the sprite to sprite1
}

void Update ()
{
    if (Input.GetKeyDown (KeyCode.Space)) // If the space bar is pushed down
    {
        ChangeTheDamnSprite (); // call method to change sprite
    }
}

void ChangeTheDamnSprite ()
{
    if (spriteRenderer.sprite == sprite1) // if the spriteRenderer sprite = sprite1 then change to sprite2
    {
        spriteRenderer.sprite = sprite2;
    }
    else
    {
        spriteRenderer.sprite = sprite1; // otherwise change it back to sprite1
    }
}

You need to have a sprite renderer attached to your GameObject.
Create a new C# Script and attach to it a GameObject. Paste the code in between the parenthesis… I’m sure you can figure it out from there :)

answered Apr 1, 2014 at 5:52

Savlon's user avatar

SavlonSavlon

1,0921 gold badge8 silver badges14 bronze badges

$endgroup$

3

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

Смена спрайта из скрипта

Смена спрайта из скрипта

Здравствуйте все!
Подскажите,пожалуйста, как из скрипта изменить спрайт объекта? Если точнее,то делаю кнопку,при наведении на неё соответственно должна менять картинку.

rockmagic
UNец
 
Сообщения: 7
Зарегистрирован: 23 июн 2014, 15:55

Re: Смена спрайта из скрипта

Сообщение Chaz 10 июл 2014, 22:19

Chaz
Адепт
 
Сообщения: 1412
Зарегистрирован: 07 апр 2012, 11:24

Re: Смена спрайта из скрипта

Сообщение Левш@ 11 июл 2014, 04:06

Если именно спрайт, то cам спрайт и надо менять видимо, у него нет параметра <texture>.
Решение в соответствующей архитектуре обьекта и кода в несколько строк. :)
Например — создаешь пустышку, вешаеш на нее колайдер.
Удочеряеш ей 2 спрайта (не нужный — неактивный).
По событиям OnMouse — активируешь деактивируешь соответствующие спрайты.

А проще это через ГУЙ реализовать. :)

Последний раз редактировалось Левш@ 08 июл 2015, 00:58, всего редактировалось 1 раз.

Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Смена спрайта из скрипта

Сообщение rockmagic 11 июл 2014, 10:46

Ура,я это сделал.Это делается так:

Используется csharp

public class StGameButSc : MonoBehaviour {

       
        public Sprite[] sprites = new Sprite[2];

       

        void OnMouseEnter()

        {
                gameObject.GetComponent<SpriteRenderer>().sprite = sprites[1];
        }

        void OnMouseExit()

        {

                gameObject.GetComponent<SpriteRenderer>().sprite = sprites[0];

        }
}

rockmagic
UNец
 
Сообщения: 7
Зарегистрирован: 23 июн 2014, 15:55

Re: Смена спрайта из скрипта

Сообщение Cuprum 07 июл 2015, 22:54

А что такое солайдер?

Cuprum
UNец
 
Сообщения: 16
Зарегистрирован: 07 июл 2015, 13:00


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 34



Although it’s a simple thing to do, changing a Sprite at runtime in Unity is a question that’s asked surprisingly often.

This may simply be because each developer’s specific needs are different, so it’s not always clear which method is the best or is the most efficient.

However, if you’ve ever tried to load all of the Sprites from a Sprite Sheet into an array from a script, or if you’ve tried to load a Sprite by its filename, what appears to be a simple task can quickly become confusing.

Especially for a beginner, like me.

But don’t worry…

There are several different uses and multiple methods available for changing sprites at runtime. So I’ve done a little digging and will be exploring each of them, along with their benefits and drawbacks, so that you can more confidently choose which one to use.

Here’s what you’ll learn in this post:

  • How to change a single Sprite from script
  • How to load Sprite from a Sprite Sheet into a Sprite Array (2 methods)
  • How to load Sprites by filename (using the Resources folder)
  • How to load Sprites by file path (using Addressable Assets)
  • 3 Examples for changing a Sprite from a Sprite Array

Let’s start with the basics…

To change a Sprite from a script in Unity, create a reference variable to hold the new Sprite. Then set the Sprite property of the Sprite Renderer Component on the Game Object you wish to change to match the new, replacement Sprite.

In scripting, it looks like this:

public SpriteRenderer spriteRenderer;
public Sprite newSprite;
void ChangeSprite()
    {
        spriteRenderer.sprite = newSprite; 
    }

In the inspector select the new Sprite that you want to use by dragging it into the field or by using the circle select button.

How to change a Sprite in Unity (Selecting the Sprite)

Select the new Sprite by dragging it into the field or by using Circle Select.

Make sure to also set the Sprite Renderer reference in the Inspector, otherwise you’ll get an error.

Alternatively, if the script is on the same Game Object, you can easily get it by using Get Component in Start.

void Start()
    {
        spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
    }

Then, when you want to change the Sprite, just call the Change Sprite function.

Like in this example if the Left Mouse Button is clicked:

void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            ChangeSprite(newSprite);
        }
    }

The example will easily change a Sprite Renderer’s existing sprite to use a different one instead. But what if you want to change to one of a number of different Sprites?

What if you have multiple Sprites, such as Slices stored in a Sprite Sheet, and you want to switch to one of them, or all of them in order, or a random Sprite, all from a script?

How to change a Sprite from a Sprite Sheet in Unity

Sprite Sheet Example in Unity

Changing a Sprite to another image from a Sprite Sheet can be done using a similar method as changing a single Sprite.

What’s different is that, in this case, the method of loading the Sprites is different, as you’ll be storing multiple Sprites in an array and retrieving the one that you want with an index.

Creating a Sprite array is simple, just add brackets to the Sprite variable to declare it as an array.

Like this:

public Sprite[] spriteArray;

Next we need to add the Sprites to the array.

There are two main ways of doing this. We’ll start with the simplest method first, which is the manual method.

Method #1. The Manual Method

This method works in much the same way as changing a single Sprite, by manually dragging the Sprites to your array in the Inspector.

Adding Sprites from a Sprite Sheet into an Array

Drag multiple Sprites to the Sprite array to automatically add them.

It helps to lock the inspector window when doing this, as it’s very easy to accidentally switch to the import settings of the file you’re trying to drag across.

How to lock the Inspector in Unity

Locking the Inspector makes it easier to add Sprites to the array.

Once the Sprites are loaded into the array you’ll be able to retrieve them using their index, like this:

void ChangeSprite() 
    { 
        spriteRenderer.sprite = spriteArray[0]; 
    }

Simply pass in the array element number in the square brackets that corresponds with the Sprite you wish to switch to.

To check which Sprite is assigned to which element, click the array dropdown in the Inspector.

When to use the manual method

The Manual Method is the simplest way to switch between multiple Sprites and is ideal if you are able to assign the sprites you’re going to use manually in the Inspector. For example, when using a Prefab.

But, what if you want to access Sprites entirely from scripting, without getting a reference to them first?

Well, as it turns out, there is a way to access Sprites from a script by their filename automatically.

Method #2. The Automatic Method

The Automatic Method allows you to access individual Sprites, or even a set of Sprites from a Sprite Sheet, without needing to get a reference to them in the Inspector.

Instead, by using this method, you will be able to load Sprites into a Scene with their filename from the Resources folder, a special folder that Unity will automatically load assets from (even if they’re not referenced in the Scene).

Normally, this is not how Unity works, as assets are usually identified by assigning references to them (as is the case in the Manual Method). As a result, using this method comes with a few words of caution (more on that later) but, if it works for you and your project, and you understand what you’re doing, here’s how to do it.

How to use the Resources folder in Unity

Add a folder named Resources anywhere in your Assets directory.

  1. First, create a new folder inside of your Assets folder called Resources. This can be placed anywhere in your Assets directory.
  2. Next place the Sprites into the Resources folder.
  3. Lastly, from a script, load the Sprite with Resources.Load<Type>(“filename”) passing in a String for the filename (without its extension).

Instead of manually adding the Sprites to the array, we can now, instead, load all of the Sprites associated with a Sprite Sheet by using Load All.

Like this:

void Start()
    {
        spriteArray = Resources.LoadAll<Sprite>("BirdHeroSprite");
    }

In the example above I’ve loaded every file of the type Sprite found in the BirdHeroSprite Texture, which is essentially a directory from which all the Slices are loaded.

While extremely useful, the Resources folder should be used with caution.

Reasons you shouldn’t use the Resources folder

Despite offering a useful option for loading assets, using the Resources folder is, generally, not recommended, as it’s not good practice.

But why?

The main reasons you should avoid using the Resources folder in Unity include:

  • Increased memory usage and a bigger application size: as everything inside the Resources folder is packaged and loaded, whether you need it or not.
  • Assets are more difficult to manage: as using filename paths can make it more likely that a connection will be broken if a file name or string is changed.
  • Longer loading and startup time: as, if you’re using a large number of assets, the operation to load them all takes exponentially longer as more and more is added to the Resources folder. In extreme cases (think thousands of assets) this can add multiple seconds to the startup time of applications to load assets that are not initially required (source).

So, while more experienced developers will no doubt understand the risks of using this special folder, and will be able to work around issues like these easily, it’s worth knowing that the general advice is not to use the Resources folder wherever possible.

So… wait, hang on…

If the Resources folder isn’t recommended, then why does it exist? And what’s the right way to use it?

When it’s OK to use the Resources folder

According to Unity, there are a couple of use cases for which the Resources folder is particularly useful:

  • Prototyping – Where performance is less important than being able to rapidly create ideas. In this case, the flexibility of the Resources folder can be extremely helpful and outweighs the performance hit.
  • Minor Uses – Using relatively few assets, that are not memory intensive, and are unlikely to change between platforms is much less likely to cause you significant issues.

Generally speaking, if your game is small or performance is not (yet) critical to your project, then using the Resources folder isn’t necessarily a problem. For more information on what Unity considers to be best practice when using the Resources folder, see this tutorial.

So what can you do if you want to load a Sprite by its filename, without using the Resources folder?

Well, what if I told you that there is an option that leverages the flexibility of the Resources folder but without the potential drawbacks.

How to load a Sprite from a script by filename (using Addressable Assets)

This method requires a little extra work to set up, but it allows you to load assets into a Scene with a filename and without the drawbacks of the Resources folder.

What are Addressable Assets in Unity?

[su_quote]The Addressable Asset system provides an easy way to load assets by “address”. It handles asset management overhead by simplifying content pack creation and deployment. The Addressable Asset system uses asynchronous loading to support loading from any location with any collection of dependencies. Whether you use direct references, traditional asset bundles, or Resource folders for asset management, Addressable Assets provide a simpler way to make your game more dynamic.[/su_quote]

Unity3d.com – Source

How to change a Sprite from a Sprite Sheet in scripting using Addressable Assets in Unity:

  1. Select Window > Package Manager and install the Addressable Assets package from the Package Manager (this requires Unity 2018.3 or later).
    Install Addressable Assets from the Unity Package Manager
  2. Next select Window > Asset Management > Addressables > Groups to open the Addressables Groups Window.
    Unity Addressables Window
  3. Click the button labelled Create Addressable Settings, this will create a default Addressable Group.
    Create a new Default Addressable Group
  4. In the Project Folder, select the Texture containing the Sprites you want to use and, in the Inspector, check the Addressable checkbox. This will reveal the asset’s Addressable Path, which you’ll need for the script.
    Unity Addressable Asset Checkbox location
  5. The file should now have been added to the default Addressable Group.
    Addressable Group Contents

The asset is now Addressable and can be accessed from a script without a reference.

Using Addressable Assets after using the Resources folder

If you were already using the Resources folder, you may have noticed the Resources directory, and its files, in the Groups Window alongside the Addressable Group. If so, dragging those assets to the Addressable Group will automatically mark them Addressable and move them into a new folder for you (as they can’t stay in Resources for this to work).

How to fix the Invalid Key Exception Error when using Addressable Assets

Depending on your version of Unity, the path that is assigned to the asset may continue to match the string that was being used for the Resources folder value (e.g. BirdHeroSprite, without a folder path or a file extension).

However, if you’re getting an Invalid Key Exception error be sure to check that the Addressable Path (displayed next to the asset’s Addressable Checkbox) matches the value you’re using in the script.

How to access Addressable Sprite Assets from a Script

Now that the Sprites are addressable it’s possible to load them from a script, without a reference. Here’s how to do it:

First, add the following two namespaces to the top of the script. These are required for the Addressable features and loading operations to work properly.

using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

You can add them below the existing namespace declarations, using UnityEngine etc.

Next we need to load the Sprites from the Sprite Sheet, just as we did when using the Resources folder.

This happens in two steps:

  1. First, load the Sprites using an asynchronous operation.
  2. When that operation is completed, assign the result to the Sprite Array.

In scripting it looks like this:

public SpriteRenderer spriteRenderer;
public Sprite[] spriteArray;
void Start()
{
    AsyncOperationHandle<Sprite[]> spriteHandle = Addressables.LoadAssetAsync<Sprite[]>("Assets/BirdHeroSprite.png");
    spriteHandle.Completed += LoadSpritesWhenReady;
}
void LoadSpritesWhenReady(AsyncOperationHandle<Sprite[]> handleToCheck)
{ 
    if(handleToCheck.Status == AsyncOperationStatus.Succeeded)
    {
        spriteArray = handleToCheck.Result;
    }
}

Instead of setting the contents of the array directly, what’s happening here is we’re starting a loading operation and creating a reference to it (the AsyncOperationHandle). Then when the loading is finished, we’re assigning the result to the Array, using the Handle reference to look up what was loaded.

Doing it in this way allows time for the assets to load.

Registering the function LoadSpritesWhenReady to the spriteHandle.Completed event means that, as soon as the assets are finished loading, the function will be called and the Sprites will be assigned to the Array.

While this part of the method could be done in several ways (inside a Coroutine for example), using an action like this avoids having to repeatedly check in Update, which would inefficient, especially since we know it’s only going to happen once.

Although using Addressable Assets requires more work than simply dropping the Sprites into the Resources folder, it’s more efficient, and it’s a much more up to date solution when compared to using the Resources folder.

A comprehensive guide of the Addressable Asset system is beyond the scope of this article but you can view the full Unity documentation here.

Now that you’ve loaded the Sprites into the Array, it’s time to put them to good use.

How to change a Sprite from an array (3 examples)

Once the Sprites are assigned to the array, you can change the Sprite Renderer’s Sprite property using the same function as in the first example. Simply pass in the name of the array and the index of the Sprite.

For example, to switch to the first Sprite in the array would look like this in scripting:

public SpriteRenderer spriteRenderer;
public Sprite[] spriteArray;
void ChangeSprite()
{
    spriteRenderer.sprite = spriteArray[0]; 
}

Or, if you want to switch to a random Sprite simply pass in a random number between zero and the length of the array. Like this:

public SpriteRenderer spriteRenderer;
public Sprite[] spriteArray;
void ChangeSprite()
{
    spriteRenderer.sprite = spriteArray[ Random.Range(0, spriteArray.Length)]; 
}

Lastly, if you want to cycle through each sprite of the array, create an Integer variable to store the last Sprite index. Then increment it every time you change the Sprite:

public SpriteRenderer spriteRenderer;
public Sprite[] spriteArray;
public int currentSprite;
void ChangeSprite()
{
    spriteRenderer.sprite = spriteArray[currentSprite];
    currentSprite++;
    if(currentSprite >= spriteArray.Length)
    {
        currentSprite = 0;
    }
}

You’ll notice in the example above that I’ve added an If Statement. This is to check if the index number has reached the end of the array. This is important as trying to retrieve a Sprite outside of the array’s range will result in an error.

Now it’s your turn

Now that you know a bit more about changing Sprites, how will you use what you’ve learned?

Or perhaps you’re still looking for a different method for changing Sprites?

Or maybe you know of a much better method for managing Sprites and are already using it in your game.

Whatever it is, let me know by leaving a comment below.

Image Attribution

  • Icons made by Kiranshastry from www.flaticon.com
  • Icons made by itim2101 from www.flaticon.com

Get Game Development Tips, Straight to Your inbox

Get helpful tips & tricks and master game development basics the easy way, with deep-dive tutorials and guides.

My favourite time-saving Unity assets

Rewired (the best input management system)

Rewired is an input management asset that extends Unity’s default input system, the Input Manager, adding much needed improvements and support for modern devices. Put simply, it’s much more advanced than the default Input Manager and more reliable than Unity’s new Input System. When I tested both systems, I found Rewired to be surprisingly easy to use and fully featured, so I can understand why everyone loves it.

DOTween Pro (should be built into Unity)

An asset so useful, it should already be built into Unity. Except it’s not. DOTween Pro is an animation and timing tool that allows you to animate anything in Unity. You can move, fade, scale, rotate without writing Coroutines or Lerp functions.

Easy Save (there’s no reason not to use it)

Easy Save makes managing game saves and file serialization extremely easy in Unity. So much so that, for the time it would take to build a save system, vs the cost of buying Easy Save, I don’t recommend making your own save system since Easy Save already exists.

Mifodiy

0 / 0 / 0

Регистрация: 07.04.2016

Сообщений: 3

1

22.10.2018, 13:55. Показов 51069. Ответов 10

Метки image, unity3d, спрайты (Все метки)


День добрый.
В Unity я новичок, в C# тоже, поэтому прошу сильно не пинать.
Сабж.
Есть объект Image, на нем спрайт и рядом кнопка. В папке Assets/Resourses лежат 3 спрайта. Планируется, чтобы при нажатии на кнопку, спрайт менялся циклически на один из трех (1-2-3-1 и т.д.). Но вместо этого изначальный спрайт меняется на белый фон и ничего больше не происходит. Прошу, ткните носом, где я ошибся. Заранее благодарю

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
 
 
 
public class ChangeClass : MonoBehaviour {
    private Sprite spr, spr1, spr2, spr3;
    public GameObject img;
    
    void Start(){
        
        
        img = GameObject.Find("ClassImage");
        spr = img.GetComponent<Image>().sprite;
        spr1 = Resources.Load<Sprite>("mage");
        spr2 = Resources.Load<Sprite>("snipe");
        spr3 = Resources.Load<Sprite>("warrior");
        Debug.Log(spr);
 
        if (spr = spr3) {
            img.GetComponent<Image>().sprite = spr1;
        }
        if (spr = spr1) {
                img.GetComponent<Image>().sprite = spr2;
            }
            else img.GetComponent<Image>().sprite = spr3;
    }
    
 
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Storm23

Эксперт .NETАвтор FAQ

10365 / 5096 / 1824

Регистрация: 11.01.2015

Сообщений: 6,226

Записей в блоге: 34

22.10.2018, 21:54

2

Mifodiy,
Во-первых, нельзя так сравнивать объекты.
Когда вы загружаете спрайт из ресурсов, создается новый объект. И сравнивать его с объектом в компоненте Image — нет смысла, они всегда будут не равны.
Во-вторых, не нужно завязывать логику приложения на визуальные компоненты и их содержимое.
Нужно создать модель данных и менять ее, а по модели данных уже строить визуальные компоненты.
В вашем случае модель простейшая — это просто номер картинки, которую нужно отображать. Нужно создать отдельное поле типа int, которое будет содержать номер отображаемой картинки и менять его при надобности. И тогда вы будете ориентироваться на ваши данные, а не на содержимое Image.

Вот пример:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using UnityEngine;
using UnityEngine.UI;
 
public class ImageChanger : MonoBehaviour
{
    //index of current image
    public int CurrentImageNumber;
 
    //names of images in Resources folder
    public string[] ImageNames = new string[] {"img1", "img2", "img3"};
 
    void Start ()
    {
        //load CurrentImageNumber from disk
        CurrentImageNumber = PlayerPrefs.GetInt("CurrentImageNumber");
        //show image
        ShowImage();
    }
 
    private void ShowImage()
    {
        //get name of image for CurrentImageNumber
        var name = ImageNames[CurrentImageNumber];
        //set image to Image component
        GetComponent<Image>().sprite = Resources.Load<Sprite>(name);
    }
 
    // Go to next CurrentImageNumber and show image
    // this method is handler of button click
    public void GoToNextImage()
    {
        //next CurrentImageNumber
        CurrentImageNumber = (CurrentImageNumber + 1) % ImageNames.Length;
        //show image
        ShowImage();
        //save CurrentImageNumber to disk
        PlayerPrefs.SetInt("CurrentImageNumber", CurrentImageNumber);
    }
}

Этот скрипт вешается на ваш Image.
А метод GoToNextImage вешается как обработчик на OnClick кнопки:

Изменить спрайт объекта Image



1



0 / 0 / 0

Регистрация: 07.04.2016

Сообщений: 3

22.10.2018, 22:42

 [ТС]

3

Спасибо огромное!



0



0 / 0 / 0

Регистрация: 04.07.2016

Сообщений: 6

11.04.2020, 16:22

4

Можешь про свой скрипт немного рассказать, просто я сейчас по нажатию хочу поменять картинку, но чет не вдупляю, откуда должны браться сами картинки



0



MrFelix

74 / 52 / 25

Регистрация: 08.03.2020

Сообщений: 243

11.04.2020, 16:32

5

Врядли он тебе подскажет, ибо тема 2018 года )
А по поводу картинок:

C#
1
2
3
4
5
[SerializeField] private Sprite[] spriteMassive; //если много картинок нужно или 
[SerializeField] private Sprite oneSprite; //один спрайт
 
yourImage.sprite = spriteMassive[1];
yourImage.sprite = oneSprite;

Добавлено через 52 секунды
PS Ссылки на картинки в испекторе укажешь

Добавлено через 1 минуту
https://habr.com/ru/post/359106/ можно ещё статью почитать



0



Katurina

2 / 2 / 0

Регистрация: 01.02.2017

Сообщений: 16

13.04.2020, 19:22

6

Картинка должна лежать в папке Assets/Resourses в проекте Unity (та на которую меняешь)
Смена происходит кодом:

C#
1
2
public image img;
img.sprite = Resources.Load<Sprite>('имя')

ps При этом надо очень внимательно с именем (одна опечатка и код работать не будет)
(данный пример применяется к объекту Image



0



74 / 52 / 25

Регистрация: 08.03.2020

Сообщений: 243

13.04.2020, 19:58

7

Цитата
Сообщение от Katurina
Посмотреть сообщение

ps При этом надо очень внимательно с именем (одна опечатка и код работать не будет)

Вот именно и вам тоже ))
public Image img;



0



0 / 0 / 0

Регистрация: 13.12.2020

Сообщений: 1

13.12.2020, 11:22

8

Цитата
Сообщение от Storm23
Посмотреть сообщение

Этот скрипт вешается на ваш Image.

Можете кто-нибудь объяснить, как повесить скрипт на Image



0



250 / 186 / 68

Регистрация: 04.03.2019

Сообщений: 1,010

16.12.2020, 23:44

9

JordyBordy, просто потянуть скрипт в нужное место.
2) вариант . ест ькнопка Add Component, там где компоненты все и там выбрать скрипт.



0



0 / 0 / 0

Регистрация: 22.02.2021

Сообщений: 1

22.02.2021, 20:54

10

Добавлено через 2 минуты
При попытке повесить скрипт на Image, пишет ошибку
The script don’t inherit a native class that can manage a script



0



0 / 0 / 0

Регистрация: 05.02.2022

Сообщений: 1

05.02.2022, 18:16

11

это значит, что имя скрипта не совпадает с именем класса



0



Это вводное руководство по Unity поможет вам начать работу с Unity 2D, создав игру, в которой нужно посадить на лунную поверхность звездный корабль.

Версия: C# 7.3, Unity 2020.3, Unity

Unity — чрезвычайно популярный и универсальный игровой движок, имеющий в своем активе длинный список поддерживаемых платформ и устройств. Когда речь заходит о Unity, вы можете подумать о 3D-играх. Движок даже раньше назывался Unity 3D! Однако большая часть мобильных, консольных и настольных игр представлена в 2D, поэтому важно понимать возможности Unity для создания 2D-игр.

В этом уроке вы создадите 2D-игру для космического корабля и по пути освоите следующие навыки:

  • Как работать со спрайтами и камерой.
  • Все о компонентах Physics 2D и о том, как обрабатывать столкновения и игровой процесс.
  • Как настроить 2D-анимацию и состояния.
  • Как порядок слоев и спрайтов влияет на 2D-игру.

Материалы для урока были созданы в Unity версии 2020.3. Вы можете скачать эту версию на странице загрузок Unity.

Примечание. Если вы новичок в Unity, то можете прочитать урок «Введение в Unity», чтобы быстрее освоиться.

Приступая к работе

Скачайте файлы проекта для выполнения урока, нажав на кнопку «Скачать материалы урока» вверху страницы.

Распакуйте содержимое архива. Затем откройте стартовый проект в Unity.

Откройте сцену Lander, расположенную в папке Scenes окна проекта. В режиме просмотра игры вы должны увидеть что-то похожее на следующее:

Окно просмотра Game в начальном проекте редактора Unity

Вы можете не увидеть точно такое же изображение из-за сортировки спрайтов, которая будет объяснена позже в этом уроке. Стартовый проект представляет собой функциональную 2D-игру с космическим спускаемым аппаратом, но в ней есть несколько проблем, которые нужно решить, прежде чем вы действительно сможете назвать его завершенным.

Готовы к взлету и опасному спуску к ближайшей посадочной площадке? Пора начинать!

Примечание. 2D-игры в Unity — вполне логично — используют 2D-режим редактора Unity. Вы можете выбрать режим 2D или 3D, когда создаете проект с нуля. Эта опция уже установлена в стартовом проекте.

Выберите 2D в окне создания проектов Unity

Спрайты в Unity

На высоком уровне спрайты — это просто объекты 2D-графики. По сути, это стандартные текстуры, которые вы обычно используете для 3D-объектов. Однако в Unity есть специальные методы комбинирования этих текстур спрайтов и управления ими, чтобы обеспечить сверхэффективную производительность в ваших играх, а также удобство разработки.

Короче говоря, со спрайтами легко работать в Unity благодаря отличному рабочему процессу 2D и встроенному редактору.

Чтобы добавить спрайт в игру, перетащите его из папки Project в окно Scene. Чтобы убедиться в простоте этого процесса, сначала выберите режим просмотра Scene. Затем перетащите спрайт playership из папки Sprites в окно Scene:

Перетаскивание спрайтов в окно Scene редактора Unity

В Иерархии нажмите на игровой объект Unity playership и просмотрите его детали в Инспекторе. Обратите внимание, что Unity автоматически подключила компонент Sprite Renderer, содержащий спрайт космического корабля, к игровому объекту:

Настройки компонента Sprite Renderer в окне Inspector редактора Unity

Это все, что нужно! Sprite Renderer позволяет отображать изображения как спрайты в 2D и 3D сценах.

Теперь удалите игровой объект playership из Иерархии.

Режимы спрайтов

Нажмите на спрайт в папке Assets / Sprites. В Инспекторе есть три разных режима, в которых можно использовать спрайты:

Переключение режимов спрайта в окне Inspector редактора Unity

  • Single: спрайт с одним изображением.
  • Multiple: спрайт с несколькими элементами, такими как анимация или таблицы спрайтов с разными составными элементами персонажа.
  • Polygon: пользовательский спрайт в форме многоугольника, с помощью которого можно создавать множество различных типов примитивных форм, например: треугольник, квадрат, пятиугольник, шестиугольник.

Таблица спрайтов — это одно изображение, которое содержит множество отдельных изображений меньшего размера, например:

Таблица спрайтов с разными изображениями двигателя космического корабля в Unity

Причина использования таблиц спрайтов заключается в том, что каждое изображение, которое вы используете в своей игре, требует одного вызова отрисовки. Для нескольких десятков спрайтов это не имеет большого значения, но по мере того, как ваша игра становится все сложнее и масштабнее, это может стать потенциальной проблемой.

Используя таблицы спрайтов, вы делаете один вызов отрисовки для множества спрайтов, тем самым повышая производительность игры. Конечно, организация таблиц спрайтов так же важна, как и их использование, но это уже другой урок!

Редактирование спрайтов

Удобно упаковать несколько графических элементов в одно изображение для анимации или объектов, которые имеют много движущихся частей; Unity упрощает управление этими таблицами спрайтов с помощью встроенного редактора двухмерных таблиц спрайтов.

В этой игре вы будете использовать две таблицы спрайтов: одну для анимации двигателя посадочного модуля, а другую — для анимации взрыва. Обе эти анимации состоят из нескольких кадров, которые вы можете редактировать и нарезать с помощью редактора спрайтов.

Assets / Sprites / Explosion / explosion-spritesheet.png уже был нарезан и подготовлен в виде анимации, но Assets / Sprites / thruster-spritesheet.png все еще требует некоторого внимания.

Таблица спрайтов с набором кадров в Unity

Нарезка таблиц спрайтов

Нажмите на Assets / Sprites / thruster-spritesheet.png в окне проекта. В Инспекторе для режима спрайтов уже установлено значение Multiple (если нет, измените его и нажмите на Apply).

Затем нажмите на Sprite Editor:

Откройте редактор спрайтов Unity

В более новых версиях Unity редактор спрайтов не установлен по умолчанию; он перемещен в систему пакетов и должен быть добавлен.

Редактор спрайтов не установлен по умолчанию в Unity

Это предупреждение появляется при первой попытке открыть редактор спрайтов.

Перейдите в Window > Package Manager. В раскрывающемся списке Packages выберите Unity Registry и найдите 2D Sprite. Нажмите на Install, чтобы добавить инструменты в свой проект.

Добавление редактора спрайтов в окне Package Manager редактора Unity

Вернитесь к thruster-spritesheet.png и снова нажмите Sprite Editor. Появится новое окно, в котором таблица спрайтов будет автоматически разделена на отдельные кадры (числа были добавлены в иллюстративных целях и не являются частью снимка экрана):

Отдельные кадры спрайта в Unity

Нажмите на Slice в верхнем левом углу окна, заметив, что Automatic является типом нарезки по умолчанию:

Разделение спрайта на кадры происходит автоматически в Unity

Это означает, что Unity попытается найти и нарезать таблицу спрайтов в меру своих возможностей. В этом сценарии все будет работать нормально, но вы также можете разрезать таблицу спрайтов по размеру или количеству ячеек.

Настройка нарезки спрайтов

Выбор параметра размера ячейки позволяет указать размер каждого кадра в таблице спрайтов в пикселях.

Нажмите на Grid by Cell Size в меню Slice редактора спрайтов:

Настройка Grid by Cell Size для разделения спрайта на кадры в Unity

В разделе Pixel Size введите 9 для X и 32 для Y. Оставьте остальные значения равными 0, а для Pivot установите значение Center. Затем нажмите Slice:

Настройка кадров в таблице спрайта редактора Unity

Нажмите на Apply в окне Sprite Editor, чтобы применить изменения:

Кнопка применения изменений для сохранения настроек спрайта в Unity

Хорошо! Теперь таблица спрайтов двигателя готова к использованию, и вы можете закрыть редактор спрайтов.

Назначение спрайтов космическому кораблю

Прямо сейчас вы не можете увидеть посадочный модуль в игре. Это потому, что к нему не прикреплены какие-либо компоненты Sprite Renderer. Не будет ни эффектных посадок, ни аварий! — если посадочный модуль не отображается на экране.

Чтобы исправить это, нажмите на игровой объект Lander в Иерархии. В Инспекторе нажмите на Add Component, а затем введите Sprite Renderer в текстовое поле поиска. И наконец, выберите компонент Sprite Renderer.

Теперь нажмите на значок маленького кружка рядом с полем Sprite в свойствах компонента и выберите спрайт playership:

Добавление игровому объекту космического корабля спрайта в окне Inspector редактора Unity

Установите параметр Order in Layer на 1. Подробнее об этом позже!

Ваша следующая задача — назначить спрайт двигателю космического корабля.

Нажмите на игровой объект LanderFeet, расположенный под игровым объектом Lander. Затем на значок маленького кружка рядом с полем Sprite в свойствах компонента Sprite Renderer. И наконец, выберите спрайт lander-feet в окне Select Sprite, как показано на изображении:

Установка спрайта для ступеней космического корабля в окне Inspector редактора Unity

Нажмите на Play; вы сможете увидеть посадочный модуль в окне Game. Используйте WASD или клавиши со стрелками, чтобы летать по экрану:

Космический корабль оторвался от поверхности и полетел в окне Game редактора Unity

Хьюстон, у нас взлет!

Если космический корабль остановлен невидимой силой, возможно, вы пытаетесь пролететь через астероид, который вы не видите из-за вышеупомянутой проблемы сортировки спрайтов. А пока просто продолжайте исследовать уголки вселенной, которых вы можете достичь (и увидеть).

2D-камера и количество пикселей на единицу

2D-проекты Unity по умолчанию имеют ортогональный вид камеры. Как правило, вы будете придерживаться этого в своих 2D-играх, а не использовать перспективный вид камеры. Вы можете узнать больше о различиях между ними во второй части урока «Введение в Unity».

На изображении ниже показана конфигурация камеры по умолчанию для Main Camera:

По умолчанию параметр проекции камеры установлен как ортографический в окне Inspector редактора Unity

Как отмечалось выше, для свойства Projection установлено значение Orthographic.

Выберите спрайт playership в окне проекта и посмотрите его настройки импорта в инспекторе. Для свойства Pixels Per Unit в настоящее время установлено значение по умолчанию 100:

Установка значений параметра Pixel Per Unit для спрайта в окне Inspector редактора Unity

Итак … что в данном случае означает 100?

Слово о пикселях на единицу

Единицы измерения в Unity не обязательно соответствуют фактическим пикселям на экране. Вместо этого вы обычно будете измерять размеры своих объектов относительно друг друга в произвольном масштабе, например, 1 единица = 1 метр. Для спрайтов Unity использует количество пикселей на единицу, чтобы определить их немасштабированный размер в единицах.

Рассмотрим спрайт, импортированный из изображения шириной 500 пикселей. В таблице ниже показано, как будет изменяться ширина игрового объекта по оси x при рендеринге спрайта с использованием разных значений пикселей на единицы в разных масштабах:

Таблица вычислений ширины пикселя за единицу в Unity

Все еще не совсем понятно? Следующий сценарий поможет вам продумать, что происходит с преобразованием единиц измерения.

Подумайте об игре, в которой используется статическая камера и отображается фоновый спрайт в полноэкранном режиме, аналогичный обоям на рабочем столе вашего компьютера.

Assets / Sprites / backdrop.png имеет высоту 2048 пикселей и соотношение пикселей на единицу по умолчанию, равное 100. Если вы посчитаете, вы обнаружите, что игровой объект Backdrop в Иерархии будет иметь высоту 20,48 единиц.

Однако свойство размера ортогональной камеры измеряет только половину высоты экрана, поэтому, чтобы соответствовать точной высоте игрового объекта Backdrop на экране в полноэкранном режиме, вы должны использовать ортогональный размер 10,24:

Наглядное объяснение значения Pixel Per Unit в Unity

Однако вам не нужно менять камеру в своем проекте, поскольку текущий размер 5 отлично подходит для движущейся камеры в вашей игре.

Галактика, которой нужно гордиться

Свойство Max Size в настройках импорта спрайта позволяет определить максимальный размер спрайта, измеряемый в пикселях. Вы можете переопределить этот параметр для каждой платформы, на которую вы планируете настроить таргетинг.

Увеличьте масштаб изображения фона синей галактики. Обратите внимание, что изображение немного размыто; когда вы импортируете спрайт, свойство Max Size по умолчанию имеет значение 2048. Unity пришлось уменьшить изображение, чтобы оно соответствовало размеру текстуры по умолчанию, что привело к потере качества изображения.

Чтобы решить проблемы с изображением, выберите спрайт фона backdrop в окне Project. Затем в окне Inspector выберите Override for PC, Mac & Linux Standalone Settings (вкладка, которая выглядит как монитор компьютера).

Затем установите флажок на Override for PC, Mac & Linux Standalone и измените Max Size на 4096. Нажмите Apply и подождите несколько секунд, пока Unity снова импортирует фон окна сцены. Вы увидите, что фон внезапно стал четким и ясным:

Изменение максимального размера текстуры в Unity

Установка максимального размера на 4096 позволяет Unity использовать полную текстуру 4096 x 4096, чтобы вы могли видеть детали в исходном изображении.

Увеличение размера

Однако за эту верность приходится платить. Проверьте область предварительного просмотра Инспектора, показанную ниже; размер фоновой текстуры теперь составляет 4,0 МБ, по сравнению с предыдущими 1,0 МБ:

Размер файла текстуры в Unity

Увеличение размера текстуры увеличило объем памяти в 4 раза.

Также стоит упомянуть, что существуют настройки переопределения для других платформ, для которых Unity поддерживает сборку. Вы можете использовать эти параметры переопределения, если планируете создавать свои игры для других платформ и хотите установить для них другие параметры размера и формата.

Примечание. 4096 x 4096 — это довольно большой файл изображения; по возможности старайтесь избегать использования такого размера, особенно для мобильных игр. В этом проекте большое изображение используется только в качестве примера.

Текстуры

Вы также можете изменить формат текстуры, как показано ниже:

Настройки формата текстуры в Unity

Возможно, вы захотите настроить формат некоторых текстур, чтобы улучшить их качество или уменьшить их размер, но это либо увеличивает объем памяти, занимаемый изображением, либо снижает точность воспроизведения текстуры. Лучший способ настроить эти параметры — изучить, как каждый из них работает, протестировать их и сравнить качество и размер полученной текстуры.

Использование формата Crunched позволяет вам установить значение ползунка качества сжатия. Значение сжатия 50% требует много времени для сжатия, но дает вам минимально возможный размер файла, и вы можете настроить его еще больше.

Верните настройки импорта фонового изображения к тому, что было до игры с настройками формата и сжатия компрессора. Затем нажмите Apply.

Итоговые настройки текстуры фона в Unity

При разработке собственных игр вам нужно будет поиграться с настройками сжатия, чтобы найти комбинацию, которая дает наименьший размер текстуры, но при этом обеспечивает желаемое качество.

2D-коллайдеры и физика

Unity позволяет настраивать гравитацию для 2D-системы Physics так же, как в 3D-играх. Настройки гравитации Unity по умолчанию для нового проекта такие же, как гравитация: по определению 9,80665 м / с2. Но вы садите свой космический корабль на Луну, а не на нашу планету, а гравитация на Луне составляет примерно 16,6% земной, или 1,62519 м / с2.

Примечание. Гравитация в стартовом проекте была установлена на -1, чтобы упростить полет и сразу же протестировать игру.

Чтобы изменить гравитацию для игры, нажмите Edit > Project Settings Затем выберите вкладку Physics 2D и используйте панель Physics 2D, чтобы изменить значение Y параметра Gravity с -1 на -1,62519:

Установка параметров гравитации в настройках двумерной физики редактора Unity

Вещи скоро станут весомые!

Нажмите на Play, чтобы запустить игру; немного облететь и посмотреть, как гравитация изменяет движение корабля:

Столкновение с объектами

Если вы уже пытались перемещать посадочный модуль в сцене, то вероятно, столкнулись с одним или двумя камнями. Это работающая система 2D-коллизий Unity.

Каждый объект, который будет взаимодействовать с гравитацией и другими физическими объектами должен иметь компоненты Collider 2D и Rigidbody 2D.

Выберите игровой объект Lander в Иерархии.

Настройки компонентов Rigidbody и Collider игрового объекта в Unity

Вы увидите прикрепленные компоненты Rigidbody 2D и Polygon Collider 2D. Добавление компонента Rigidbody 2D к спрайту переводит его под контроль 2D-физической системы Unity.

Краткий урок по компонентам физики

Сам по себе компонент Rigidbody 2D означает, что гравитация будет влиять на игровой объект, к которому он прикреплен. Он также позволяет вам управлять объектом из скриптов, используя методы, связанные с Physics2D, которые применяют к нему силы.

Но если вы хотите, чтобы спрайт взаимодействовал и сталкивался с другими объектами, вам также понадобится компонент Collider 2D. Добавление соответствующего компонента коллайдера заставляет спрайт реагировать на столкновения с другими спрайтами.

Полигональные 2D-коллайдеры более требовательны к производительности, чем другие простые коллайдеры, такие как 2D-компоненты Box или Circle Collider, но они делают возможным более точное физическое взаимодействие между объектами. Всегда используйте самую простую форму коллайдера, которую вы можете использовать в своей игре, чтобы обеспечить максимальную производительность.

Сталкивающиеся многоугольники

Изучите коллайдер на космическом корабле, выбрав игровой объект Lander в Иерархии и нажав Edit Collider на Polygon 2D Collider:

Кнопка для редактирования коллайдера игрового объекта в Unity

Наведите курсор мыши на края коллайдера в окне сцены. Появляются направляющие, которые позволяют перемещать точки коллайдера, и вы также можете создавать или удалять точки, чтобы изменить форму коллайдера:

Редактирование полигонального коллайдера игрового объекта в Unity

Оставьте форму коллайдера Lander как есть.

Примечание. Код в скрипте Lander.cs, прикрепленном к игровому объекту Lander, использует OnCollisionEnter2D для обработки столкновений с другими объектами в игровой сцене. Если величина силы столкновения превышает определенный порог, посадочный модуль будет разрушен.

Посадочная площадка также нуждается в коллайдере; иначе космический корабль провалился бы насквозь, когда попытается приземлиться!

В Иерархии дважды нажмите на игровой объект LanderObjective, чтобы сфокусироваться на посадочной площадке. Используя Инспектор, нажмите Add Component и выберите Box Collider 2D:

Прямоугольный двумерный коллайдер игрового объекта в Unity

Unity добавляет компонент Box Collider 2D в игровой объект LanderObjective и автоматически изменяет размер коллайдера в соответствии с размером спрайта.

Прямоугольный двумерный коллайдер для платформы космического корабля в Unity

Клево!

Еще несколько вещей

При работе с компонентами Rigidbody и 2D Collider следует иметь в виду еще несколько вещей:

  • Измените Rigidbody, чтобы использовать тип тела Kinematic, если вы хотите перемещать свои физические тела с помощью компонента преобразования вместо того, чтобы позволять только гравитации влиять на них. Чтобы оставить их под контролем гравитации Unity, используйте Dynamic. Если они вообще не будут двигаться, установите для них Static.
  • Вы также можете изменять массу, линейное сопротивление, угловое сопротивление и другие физические свойства компонентов Rigidbody.
  • Коллайдеры можно использовать в режиме триггера; они не будут физически сталкиваться с другими физическими объектами. Вместо этого они позволяют вашему коду реагировать на событие с помощью метода OnTriggerEnter2D, доступного во всех скриптах MonoBehaviour.
  • Для обработки событий столкновения в коде скрипта используйте OnCollisionEnter2D, который доступен во всех скриптах MonoBehaviour.
  • Вы можете назначить дополнительные ссылки Physics2D Material 2D коллайдерам для управления такими свойствами, как упругость или трение.

Примечание. Вы можете не заметить этого, когда в игре всего несколько объектов, но когда у вас есть сотни объектов на экране, все участвующие в физическом взаимодействии, использование более простых форм коллайдера улучшит производительность вашей игры.

Если на сцене редактора Unity множество объектов, то можно подумать использовать двумерные полигональные коллайдеры

Вы можете пересмотреть свою стратегию использования 2D-компонентов Polygon Collider, если у вас много сталкивающихся объектов!

Анимация космического корабля

Ваш посадочный модуль не был бы полноценным без видимых двигателей, увеличивающих силу противодействия силе тяжести. Прямо сейчас двигатели корабля работают, но нет визуальной обратной связи, что используется топливо для движения.

Unity Анимация 101

Чтобы назначить анимацию игровому объекту в сцене, прикрепите компонент Animator к игровому объекту или объектам, которые вы хотите анимировать. Для этого компонента требуется ссылка на Animator Controller, который определяет, какие анимационные клипы использовать и как управлять этими клипами, а также с другими «более интересными» эффектами, такими как смешивание и переход анимаций.

Контроллер Animator для двигателей

В Иерархии разверните игровой объект Lander, чтобы открыть четыре других вложенных игровых объекта. Выберите ThrusterMain; вы увидите, что к нему уже прикреплен компонент Animator, но он не ссылается на контроллер Animator:

Компонент Animator игрового объекта без назначенного контроллера в Unity

Не снимая выделения с игрового объекта ThrusterMain, перейдите на вкладку редактора Animation. Если вы не видите эту вкладку в главном окне редактора, откройте ее, выбрав Window > Animation > Animation:

Как открыть окно Animation в меню редактора Unity

При выбранном игровом объекте в Иерархии, в окне Animation будут отображаться анимации, связанные с этим игровым объектом — точно так же, как окно Inspector показывает компоненты, связанные с этим игровым объектом. Нажмите Create, чтобы создать анимационный клип для ThrusterMain:

Создание анимационного клипа в Unity

Введите имя ThrusterAnim и поместите его в папку Assets / Animations.

Теперь вы должны увидеть два новых ассета анимации в папке Animations в окне Project. ThrusterAnim — это анимационный клип, который будет содержать анимацию для эффекта двигателя, а ThrusterMain — это контроллер аниматора, который будет управлять анимацией:

Создание анимационного клипа в Unity

Вы увидите временную шкалу анимации в окне Animation; здесь вы можете разместить и упорядочить отдельные кадры спрайта двигателя космического корабля.

Нажмите на Add Property и выберите Sprite Renderer / Sprite в качестве типа свойства для анимации:

Кнопка добавления свойства в окне Animation редактора Unity

Добавление свойства анимации в Unity

Теперь редактор должен выглядеть так:

Панель шкалы времени в окне Animation редактора Unity

Время работать над графиком

Работа над шкалой времени анимации

В окне Project нажмите на папку Sprites и разверните спрайт thruster-spritesheet.png. Выделите четыре нарезанных спрайта двигателя и перетащите их на временную шкалу ThrusterMain: Sprite в редакторе анимации.

Кадры спрайтов в итоге сгруппированы вместе на шкале времени; вы можете исправить это сами. Начните с самого правого спрайта; нажмите на спрайт, перетащите его вправо и разместите примерно на 0:05 от его соседа:

Назначение кадров спрайта анимации игровому объекту в Unity

Выберите последний кадр на отметке 1:00 и нажмите Delete, чтобы удалить его.

Удаление последнего кадра анимации игрового объекта в Unity

В окне Animation нажмите на Preview, затем на кнопку Play. Сосредоточьтесь на спускаемом корабле в окне сцены, чтобы увидеть предварительный результат работы!

Отображение анимации двигателей космического корабля для игры в Unity

Двигатели готовы, капитан!

Если все еще выбран ThrusterMain, вы также можете увидеть изменение Sprite в компоненте Sprite Renderer:

Анимация спрайта в компоненте Sprite Renderer редактора Unity

Красиво переключается

Пришло время настроить контроллер анимации.

Настройка контроллера анимации

Скрипт Lander.cs в настоящее время устанавливает для параметров анимации значение true или false, в зависимости от того, запускает ли игрок двигатели. Контроллер анимации будет оценивать эти параметры и разрешать вход или выход из определенных состояний.

В окне Project нажмите на подпапку Animations. Затем дважды щелкните на ThrusterMain.controller. Откроется редактор Animator, где вы увидите контроллер Unity, добавленный заранее, когда вы создали анимационный клип на игровом объекте ThrusterMain:

Настройка анимации игрового объекта в окне Animator редактора Unity

Прямо сейчас анимация двигателя работает непрерывно. По логике, анимация должна запускаться только в том случае, если игрок в данный момент управляет космическим кораблем.

Щелкните правой кнопкой мыши на область сетки редактора Animator и выберите State / Empty:

Создание состояния анимации для клипа игрового объекта в Unity

Используйте Инспектор, чтобы назвать новое состояние NoThrust. Это состояние по умолчанию для анимации, когда игрок не вводит данные:

Игровой объект космический корабль без взаимосвязи с состоянием анимации двигателя в окне Animator редактора Unity

Из Entry аниматор должен перейти непосредственно к NoThrust и оставаться там до тех пор, пока логический параметр не станет истинным. Чтобы изменения состояния анимации происходили, вам необходимо добавить соединения с помощью переходов.

Нажмите правой кнопкой мыши на NoThrust и выберите Set As Layer Default State. NoThrust теперь должен быть оранжевым, как показано ниже, а стрелка от Entry теперь указывает на No Thrust:

Установка перехода между состояниями анимации игрового объекта в Unity

Оранжевый цвет указывает на то, что состояние будет запускаться первым.

В редакторе Animator нажмите + на вкладке Parameters, чтобы создать новый тип параметра Bool. Назовите его ApplyingThrust:

Создание нового параметра для состояния анимации игрового объекта в Unity

Нажмите правой кнопкой мыши на NoThrust, затем на Make Transition, нажмите на ThrusterAnim, чтобы создать переход, который позволяет изменять состояние между двумя состояниями. Теперь выполните тот же набор шагов, но на этот раз создайте переход от ThrusterAnim к NoThrust:

Соединение состояний анимации игрового объекта в окне Animator редактора Unity

Нажмите на линию перехода от NoThrust к ThrusterAnim, затем на + в инспекторе, чтобы добавить условие, чтобы выбрать единственное доступное условие: ApplyingThrust.

Убедитесь, что в раскрывающемся списке выбрано значение true. Это означает, что ApplyingThrust должен иметь значение true, чтобы анимация перешла в состояние ThrusterAnim.

Установка свойству перехода анимации значения true в окне Animator редактора Unity

Теперь отредактируйте линию перехода от ThrusterAnim к NoThrust, чтобы использовать то же условие ApplyingThrust. Однако на этот раз вы проверяете ложное условие:

Установка значения false свойству перехода анимации в окне Animator редактора Unity

Вы можете настроить скорость воспроизведения анимации в редакторе Animator по своему усмотрению. Нажмите на состояние ThrusterAnim и в Инспекторе измените свойство Speed на 1.5:

Настройка параметра скорости для анимации в окне Inspector редактора Unity

Анимация двигателей должна быстро реагировать, чтобы отразить реакцию на спусковой крючок игрока, чтобы она выглядела отзывчивой. Щелкните по обеим линиям перехода — между NoThrust и ThrusterAnim — и используйте Инспектор, чтобы изменить настройки, связанные с переходом, на 0. Также снимите флажки Has Exit Timeи Fixed Duration:

Настройки перехода анимации для двигателя космического корабля в Unity

И наконец, примените ту же анимацию и контроллер к левому и правому подруливающим устройствам. Выберите ThrusterLeft и ThrusterRight в Иерархии, затем перетащите ThrusterMain.controller из папки Animations в окне проекта в свойство Controller компонента Animator:

Перетаскивание ассетов и игровых объектов для ссылок параметров в окне Inspector редактора Unity

Нажмите на Play, чтобы запустить игру; опробуйте свои новые двигатели с помощью WASD или клавиш со стрелками:

Воспроизведение анимации двигателей игрового объекта космического корабля в окне Game редактора Unity

Хьюстон, мы взлетели!

Сортировка спрайтов и слои

Никакой 2D-движок не был бы полным без возможности сортировки спрайтов. Unity позволяет сортировать и упорядочивать спрайты, используя систему слоев и порядок в слоях.

Нажмите на Play в редакторе, чтобы запустить игру еще раз; используйте свои худшие способности пилотирования, чтобы врезаться посадочным модулем в ближайшую скалу. Взгляните на окно Scene в редакторе, когда появится кнопка Restart. Вы можете заметить, что некоторые камни исчезли за фоном:

Некорректное отображение фона игры в редакторе Unity

Возможно даже, что вы открыли стартовый проект и видели только фоновое изображение. Если это так, молодцы, что зашли так далеко!

Причина, по которой это происходит, заключается в том, что механизм рендеринга не может определять порядок слоев спрайтов. Все спрайты, кроме корабля, в настоящее время настроены на использование слоя сортировки по умолчанию с порядком рендеринга -1. Вашей видеокарте будут даны все вызовы отрисовки, но не будет сказано, в каком порядке их отрисовывать!

Чтобы исправить это, вы можете использовать систему слоев и порядок в слоях для разделения спрайтов. Unity будет отображать спрайты на этих слоях в определенном порядке слоев. И для каждого отдельного слоя Unity будет использовать порядок спрайтов в нумерации слоев для каждого спрайта, чтобы определить, в каком порядке он должен отображать каждый спрайт.

Вы можете думать об этом как об упорядоченном списке:

  1. Layer A
    1. Order 0
    2. Order 1
  2. Layer B

Пора добавить несколько слоев

Нажмите на Edit > Project Settings и выберите Tags and Layers. Разверните раздел Sorting Layers.

Нажмите на +, чтобы добавить три новых слоя:

  • Background
  • Rocks
  • Player

Нажмите на указатели и перетащите их рядом с каждым слоем, чтобы убедиться, что они расположены в указанном выше порядке. Порядок слоев здесь определяет порядок, в котором Unity будет отображать спрайты на этих слоях:

Порядок слоев игрового объекта в сортировке слове редактора Unity

Как и лук, космическое пространство игры состоит из слоев!

Нажмите на Backdrop в иерархии; в компоненте Sprite Renderer нажмите на раскрывающийся список Sorting Layer и выберите Background из списка:

Установка значения для сортировки слоя в компоненте Sprite Renderer редактора Unity

Теперь камни определенно будут за фоном, потому что они все еще находятся на слое по умолчанию!

Разверните игровой объект Rocks и выделите все дочерние игровые объекты Rock. Используйте Инспектор, чтобы изменить объекты для использования слоя сортировки камней следующим образом:

Настройка сортировки слоев в компоненте Sprite Renderer редактора Unity

Поскольку камни в сцене имеют тенденцию перекрывать друг друга, они полезны для демонстрации того, как свойство Order in Layer работает для спрайтов на определенном слое.

Если вы не указали каждому камню в слое Rocks отдельные значения упорядочения, вы могли бы заметить, что камни случайным образом «всплывают» поверх других во время игры. Это связано с тем, что Unity не будет последовательно отображать камни в одном и том же порядке, поскольку в настоящий момент все они имеют одинаковый порядок в слое.

Поищите перекрывающиеся камни и назначьте тем, что спереди, более высокое значение Order in Layer, чем тем, что позади них:

Установка порядка перекрывающих камней в слое редактора Unity

Нажмите на Lander в Иерархии и измените свойства слоя сортировки для этого Sprite Renderer и всех его дочерних компонентов Sprite Renderer на слой сортировки Player.

Сделайте то же самое для игровых объектов Fuel в разделе Pickups в Иерархии. Это гарантирует, что они будут отображаться поверх всего остального.

Тонкая настройка слоев

Однако есть одна проблема. А как насчет спрайтов для анимации двигателя (и опор посадочного модуля, которые обычно прячутся за посадочным модулем)? Если вы не установите для них и для самого игрового объекта Lander конкретный порядок в номере слоя, вы увидите некоторые странные проблемы с рендерингом!

Некорректное отображение слоев спрайта космического корабля в Unity

Измените свойство Order in Layer для Lander на 2. Выберите каждый дочерний игровой объект Thruster, а также игровой объект LanderFeet и установите для их Order in Layer значения 1.

Когда посадочный модуль приземляется на посадочную площадку, площадка немного опускается вниз, показывая, что вы приземлились. Посадочная площадка и каменные спрайты накладываются друг на друга, поэтому, чтобы эффект выглядел правильно, вам нужно разместить посадочную площадку позади камня.

Измените спрайт LanderObjective, чтобы использовать слой Rocks, и присвойте ему значение Order in Layer, равное 0. Установите для камня под LanderObjective значение Order in Layer, равное 1:

Спрайты посадочной площадки космического корабля и камней снизу в окне Scene редактора Unity

И наконец, нажмите на префаб Explosion в папке Prefabs и измените его параметр Sorting Layer на Player:

Установка префаба взрыва в качестве слоя сортировки редактора Unity

Крутые люди не смотрят на взрывы. Но мы смотрим!

Нажмите на Play и проверьте свои навыки пилотирования, взяв запас топлива и приземлившись на посадочную площадку. Только будьте осторожны, чтобы не прикладывать слишком много толчков в одном направлении, чтобы избежать камней!

Плавная стыковка с посадочной площадкой космического корабля в окне Game редактора Unity

Успешно справился!

Имея достаточно практики, вы сможете садить ракеты так же хорошо, как Space X!

Куда двигаться дальше?

Скачайте завершенный проект, нажав на кнопку «Скачать материалы урока» вверху страницы.

Вы рассмотрели большинство важных особенностей 2D-дизайна Unity и можете показать это в забавной маленькой игре с гравитационным посадочным устройством!

Почему бы не вывести свою игру на новый уровень, добавив классную функцию повтора? Следуйте инструкциям по созданию системы воспроизведения в Unity, чтобы узнать, как это сделать.

Или, если вы хотите попробовать более глубокую 2D-анимацию и эффекты спрайтов, почему бы не проверить Unity 2D Techniques: Build a 2D Pinball Game?

Надеемся, вам понравился этот урок. Если у вас есть какие-либо вопросы или комментарии, присоединяйтесь к обсуждению.

Автор перевода: Jean Winters

Источник: Introduction to Unity 2D

Смотрите также:

Как сделать систему пауэр-апов в UnityКак сделать систему пауэр-апов в Unity

как импортировать 2d-ресурсы в UnityИмпортирование 2D-ресурсов в Unity

Ссылки

Основы скриптинга Unity

Исходники 2D платформера

Урок от GeekBrains и подробное описание всех компонентов, которые используются в данных примерах. Обязательно изучите

Разница между 2D и 3D

Unity поддерживает разработку 2D-игр, и для удобства процесса разработки перед созданием нового проекта он может быть определен как 2D.

Picture1

Переключение режима разработки в уже созданном проекте осуществляется через меню Edit – ProjectSettings–Editor–DefaultBehaviorMode–Mode.

Picture2

В 2D-режиме Unity вносит некоторые изменения в настройки редактора:

  • Окно сцены по умолчанию включено в 2D-режиме (если необходимо, данная настройка легко переключается обратно в 3D-режим с помощью переключателя в верхней части окна сцены). Эта настройка независима от остальных настроек 2D-режима и может быть изменена в любое время.
  • Свойство «Projection» камеры по умолчанию установлено в «Orthographic», а «Size» равно.
  • При импорте новых изображении их Texture Type по умолчанию установлен в «Sprite (2DuGUI)».

Компоненты 2D-объектов

Рассмотрим некоторые компоненты и события 2D-объектов и их отличия от компонентов и событий,использующихся для 3D-объектов.

Компоненты

BoxCollider2D –это прямоугольный коллайдер, используемый при работе с 2D физикой.

Picture3

2D коллайдер/триггер обрабатывает события (сталкивание, пересечение и т.д.) независимо от того, где он располагается по координате Z. Все свойства коллайдера точно такие же, как и у BoxCollider, за исключением одного. Переключатель Used By Effector отвечает за то, используется ли данный коллайдер прикрепленным компонентом – Effector 2D (данные компонент бывает разного типа: точка, область, платформа и т.д.).

  • Material – физический материал, который определяет свойства столкновений, такие как трение и отскок.
  • IsTrigger – является ли коллайдер триггером?
  • Used by Effector – используется ли данный коллайдер прикрепленным компонентом – Effector.
  • Auto Tiling – установите этот флажок, если компонент Sprite Renderer установлен в режим Tile. Это позволит автоматически, обновлять форму коллайдера, которая будет корректироваться по форме спрайта.
  • Offset – локальное смещение геометрии коллайдера.
  • Size – ширина и высота прямоугольника в единицах локального пространства.
  • Edge Radius – смягчает грани, делая коллайдер более круглым, по умолчанию значение равно
  • Info – общая информация о состоянии коллайдера.

Визуальное отображение пустых объектов с 2D- и 3D-коллайдерами при включении 3D-режима в окне сцены:

Picture4

Rigidbody2D – компонент помещает объект под контроль физического движка. В целом компонент похож на Rigidbody, но объект может двигаться только в плоскость XY, а вращаться только перпендикулярно этой плоскости.

Picture5

Отличительные свойства:

  • UseAutoMass – рассчитать массу автоматически,исходя из коллайдера;
  • GravityScale – как гравитация воздействует на объект;
  • Sleeping Mode – режим, когда объект выключается из физической симуляции (в целях оптимизации).
  • Never Sleep – всегда активен (необходимо стараться избегать данного режима);
  • Start Awake – активен при запуске (режим включен по умолчанию);
  • Start Asleep – не активен при запуске, но может быть разбужен (столкновением или через скрипт).

Спрайты

Настройки спрайта (Import Settings)

После импорта изображения в проект в 2D-режиме разработки его настройки по умолчанию выглядят следующим образом:

Picture6

  • В верхней части находится иконка – превью спрайта (также превью находится в нижней части инспектора), отображается название файла, кнопка Open, которая открывает изображение в программе просмотра изображений, установленной в системе по умолчанию.
  • Texture Type – устанавливает базовые параметры в зависимости от предназначения текстуры(изображения).
  • Sprite Mode – устанавливает, в каком режиме спрайт будет извлекаться из изображения, как один спрайт (Single) или как несколько раздельных спрайтов (Multiple). Второй режим может использоваться для импорта спрайтов как кадров анимации, а также как несколько спрайтов, относящихся к одному объекту. Третий режим Polygon позволяет настраивать форму, размер и pivot point для вашего спрайта.
  • PackingTag – имя атласа, в который данное изображение должно быть запаковано.
  • Pixels Per Unit – количество пикселей в изображении спрайта, которые соответствуют одному юниту (внутренняя единица измерения в Unity).

Компонент Sprite Renderer

Данный компонент позволяет отображать спрайты и используется как в 2D, так и в3D-сценах.

Picture7

Компонент имеет следующие свойства:

  • Sprite – спрайт.
  • Color – цвет.
  • Flip – отражение спрайта по оси X или Y.
  • Material – материал, стандартные шейдеры, которые используют для материала спрайта – Sprites/Default (не взаимодействует с освещением на сцене), Sprites/Diffuse (взаимодействует с освещением на сцене).
  • Draw Mode – выберите параметр из списка Draw Mode, чтобы определить, как масштабируется спрайт при изменении его параметров.
  • Simple – это значение по умолчанию. Изображение изменяется во всех направлениях,когда его размеры меняются.
  • Sliced – применяйте это, если хотите нарезать спрайт на 9 частей, чтобы эти части можно было растягивать. В этом режиме углы остаются одинаковыми, верхняя и нижняя часть тянутся в собственную высоту, а центр тянется в ширину и высоту.
  • Size – используйте это значение, чтобы изменить горизонтальный и вертикальный размер спрайта. Если вы хотите, чтобы slice работала корректно, вам нужно настроить это значение. Компонент Transform применяется только по умолчанию.
  • Tiled – применяйте это если хотите нарезать спрайт на 9 частей, чтобы эти части можно было повторять. В этом режиме углы остаются одинаковыми, верхняя и нижняя часть тянутся в собственную высоту, а центр тянется в ширину и высоту.

Sprite Creator

С помощью этого инструмента можно создавать временные заменители спрайтов. Их можно использовать в проекте в процессе разработки, а затем, когда будет создана необходимая графика, заменить. Для создания таких спрайтов необходимо выбрать меню Assets – Create – Sprites, далее один из доступных типов спрайтов: Square, Triangle, Diamond, Hexagon, Circle, Polygon.

Через меню Assets – Create создаются не объекты, а ассеты, поэтому после создания спрайта в папке проекта появляется новый ассет, а на сцене ничего не изменяется. Далее необходимо добавить созданный спрайт на сцену.

Спрайты в окне проекта:

Picture8

Спрайты на сцене:

Picture9

При создании спрайта Polygon открывается Sprite Editor, где можно изменить форму спрайта и некоторые его параметры. Далее более подробно об этом редакторе.

Sprite Editor

Чаще всего спрайт – это одно изображение, но иногда спрайт содержит несколько элементов, которые каким-либо образом связаны друг с другом и объединены в одно изображение. Для работы с такими спрайтами в Unity есть специальный редактор.

Если для спрайта установлен режиме Sprite Mode – Single, часть функций редактора недоступна, и он выглядит следующим образом:

Picture10

В режиме SpriteMode – Multiple:

Picture12Picture11

SpritePacker

При работе со спрайтовой графикой очень важно при работе с разными персонажами работать с разными файлами текстур. Однако, значительное пространство спрайтовой текстуры будет уходить на пустые участки между графическими элементами, результатом чего станет бесполезный расход памяти при работе игры или приложения. Для достижения оптимальной производительности лучше всего будет упаковывать графические элементы из нескольких спрайтовых текстур как можно плотнее в одну текстуру, именуемую атласом. В Unity есть утилита Sprite Packer, предназначенная как раз для создания таких атласов из набора отдельных текстур.

Необходимо указывать Packing Tag в настройках текстуры, чтобы включить упаковку спрайтов для данной текстуры.

По умолчанию упаковщик спрайтов отключён, но его работу можно настроить через настройки редактора Edit->Project Settings->Editor. Метод упаковывания спрайтов можно установить в состояние Enabled for Builds (упаковывание будет работать для сборок, но не в режиме Play) или в состояние Always Enabled (упаковывание будет работать и во время сборки и в режиме Play).

Указав для нескольких текстур (спрайтов) одинаковый Packing Tag, можно открыть Windows – SpritePacker, нажать кнопку Pack и посмотреть расположение текстур в атласе.

Если выбрать спрайт в окне проекта, он подсветится, чтобы показать своё местоположение на атласе. Видимый контур представляет собой контур самого меша, а также показывает область, которая будет использована для плотной упаковки.

Инструменты в верхней части окна упаковщика спрайтов:

  • Pack – инициализирует операцию упаковывания.
  • Repack – переупаковка атласа (обновление).
  • View Atlas – атлас, который необходимо отобразить в окне (если при максимальном размере текстуры в неё не помещаются все спрайты, атлас может быть разбит на множество страниц).
  • Page – позволят выбрать страницу атласа, которую необходимо отобразить в окне.
  • Меню, следующее за номером страницы – выбор правил упаковывания использующиеся для текущего атласа.

Упаковщик спрайтов использует правила упаковки, чтобы определять, как применять спрайты к атласам. Можно создавать и свои собственные правила упаковки.

Атласы кешируются в ProjectLibraryAtlasCache. Удаление этой папки и последующий запуск Unity приведёт к принудительной перепаковке всех атласов. Во время удаления Unity необходимо закрыть. Максимальный размер атласа по умолчанию равен 2048х2048. При назначенном свойстве PackingTag текстуры не будут сжиматься, чтобы упаковщик спрайтов мог использовать оригинальные значения пикселей при сжатии атласов.

Понятие FPS

FPS – аббревиатура от Frames Per Second, что в переводе на русский означает количество кадров в секунду. Видео – это процесс смены статических кадров. Каждый кадр – это статическое изображение. Количество кадров в секунду – это скорость смены изображений.

В компьютерной игре используется визуализация на основе рендеринга. То есть каждая картинка кадра визуализируется за счет программно-аппаратных алгоритмов на основе действий игрока.

Человеческий глаз способен воспринимать смену картинок, как видео при смене не менее 25-30 кадров в секунду.

Чем качественнее каждая картинка в кадре, тем больше ресурсов компьютера нужно для ее рендеринга и чем больше логических операций в коде, тем больше ресурсов процессора нам потребуется, чтобы выполнить кадр, а соответственно потребуется больше времени на подготовку следующего кадра, таким образом показатель FPS будет уменьшаться, что приведет к нестабильной работе нашей программы.

Чем ниже показатель FPS, тем меньше кадров для логики. В этих самых кадрах и происходит наша игровая логика, поэтому задача программиста оптимизировать работу каждого кадра.

Picture13

Основные методы класса MonoBehaviour

MonoBehaviour – класс, на базе которого (наследуются) по умолчанию создаются все скрипты в Unity. Скрипты создаются через контекстное меню в окне проекта, через меню Component на верхней панели инструментов, при помощи кнопки Add Component в окне инспектора (когда выделен какой-либо объект). Скрипт работает только тогда, когда он является компонентом объекта на сцене, причём некоторые функции (методы) скрипта могут срабатывать даже тогда, когда сам скрипт выключен(неактивен).

Для редактирования скрипта после его создания необходимо дважды нажать на него ЛКМ в окне инспектора или в окне проекта. Скрипт откроется в той среде разработки, которая указана в настройках Editor–>Preferences–>External Tools–>External Script Editor (обычно это Visual Studio или MonoDevelop). Там же можно сменить среду разработки.

Имя класса в скрипте должно совпадать с именем файла (это происходит автоматически, при создании файла). По умолчанию в скрипте создаются две функции (метода) – Start() и Update(), но существуют и другие функций, которые могут быть использованы как унаследованные от MonoBehaviour. Так же можно создавать свои функции.

По умолчанию скрипт выглядит следующим образом:

using System.Collections;

using UnityEngine;

public class MyFirstScript : MonoBehaviour
{
    private void Start()
    {
    }

    private void Update()
    {
    }
}

Awake()

Функция, которая вызывается один раз при запуске игры до функции Start(). Вызывается в случайном порядке среди объектов на сцене, для которых она реализована. Функция срабатывает даже тогда, когда скрипт не активен.

Start()

Функция, которая также вызывается один раз, но в тот момент, когда скрипт становится активным. Вызывается перед функций FixedUpdate(),Update()ит.д.

FixedUpdate()

Функция, которая выполняется каждый фиксированный отрезок времени. Можно настроить в Edit–>Project Settings–>Time – Fixed Time step. Используется для обработки физики (приложения силы, импульса к объект у и т.д.)

Update()

Функция, которая выполняется каждый кадр. Используется для обработки игровой логики.

Для того, чтобы реализовать выполнения какой-либо действия с определенной частотой, например, раз в секунду,используют Time.deltaTime * 1.

deltaTime – время (в секундах), прошедшее с последнего кадра. Это значением позволяет сделать игру независимой от скорости смены кадров.

LateUpdate()

Функция, которая выполняется каждый кадр. Вызывается после того, как все Update() функции будут вызваны. Используется для того, чтобы упорядочить выполнения действий в скрипте. Например, если камера следует за объектом, движение которого реализовано в Update() функции.

Практика

Рассмотрим проект на примере 2D Platformer’a от UnityTech.

Picture14

Давайте разберем, из чего состоит основа геймплея 2DPlatformer’a.

Самым важным объектом является игрок, поэтому с него мы и начнём.

Picture15

Picture16

Итак, наш персонаж состоит из множества компонентов, основным из них является Player Control, который позволяет нам перемещаться, прыгать и даже издавать звуки. Этот компонент завязан на анимации и физике поэтому, чтобы его использовать, нам понадобится добавить аниматора и физические компоненты.

Аниматор — позволит нам анимировать нашего героя.

Picture17

Rigidbody позволит физически взаимодействовать с препятствиями, а чтобы мы не проваливались под пол и фиксировать столкновения с препятствиями, нам понадобится Box Collider2D.

Picture18

Picture19

При добавлении данных компонентов на наш спрайт мы с вами уже получили подвижного персонажа, с которым можно работать дальше.

Picture20

На основной демонстрационной сцене есть куча разных объектов, которые могут нам пригодиться для создания своей игры, их можно найти, если вы выберете нужный объект и найдёте на компоненте sprite renderer поле sprite, кликнув на него, редактор покажет, где у вас в проекте лежит данный объект.

Picture21

Теперь можно расставлять объекты на сцене, просто перетаскивая их из окна Project. Буквально за несколько движений мы с вами уже сделали свой уровень с персонажем.

Picture22

Главное, не забыть положить нашему персонажу объект groundCheck в иерархии, как дочерний, чтобы мы могли прыгать и указать всем балкам, что они лежать на слое Ground, не забывая о коллайдерах.

Практическое задание

** Проект 1 (Используя готовый проект собрать свой игровой уровень)

  • Скачать несколько бесплатных ассетов и собрать свой уровень.
  • Заменить спрайт персонажа на свой.
  • Собрать свою сцену на основе 2D-платформера, чтобы противники спаунились и их можно было убивать.

Проект 2 (Используя графику, анимации, звуки реализовать простейший раннер)

Необходимо используя имеющиеся в прошлом проекте ресурсы, переделать игровую логику так, чтобы главной задачей персонажа было добежать от левого края игровой сцены до правой.

  • Написатьмодифицировать скрипт контроллера (передвижение). Персонаж бежит сам. От игрока требуется только прыгать над противниками. В случае падения в воду и столкновения с противником – умирать.
  • Персонаж находится в середине экрана. Камера следует за персонажем.
  • В случае смерти игрок стартует сначала со стартовой точки.
  • В случае успеха игрок переносится в стартовую точку.
  • Реализовать спаунер (место от куда они появляются)противников. Противники должны передвигаться в пределах одной платформы.
  • Размер игрового окна – 1366×768.
  • Примеры похожих игр: BeatRush (ios, Android), GeometryDash (ios, Android, Steam) и другие. Поиграйте, изучите как работают игры такого типа.

Примерное изображение игрового уровня:

Picture23

Дополнительные материалы

  • Asset Workflow
  • Mipmap
  • 2D физика

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить способы оплаты на айфоне
  • Как изменить состояние доступности файла
  • Как изменить состояние диска на загрузочный
  • Как изменить состояние волос
  • Как изменить способности варфрейма

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии