в домашних условиях

» Unity3d » Unity3D. Онлайн игра 12 обезьян, скрипты и материалы для разработки

Unity3D. Онлайн игра 12 обезьян, скрипты и материалы для разработки

Онлайн игра 12 обезьян
Открыл для себя мир Unity3d. Был поражен лёгкостью и простотой создания игр с помощью инструментов юньки. Начал  изучение с уроков, выложенных у них на официальном сайте. Кстати, там же можно бесплатно скачать платформу Unity. Первый урок RollaBall лег в основу выставленной игры. Фактически я её только украсил(как мне кажется) и довёл до логического конца, а именно:

  • натянул текстуры на объекты;
  • добавил случайную генерацию уровней двух типов: по кругу и по решётке;
  • добавил пару иначе обрабатываемых препятствий: одно ускоряет движение шара, а второе уменьшает количество жизней;
  • добавил сохранение таблицы максимальных результатов (для Web не работает) ;
  • изменил интерфейс.

Все изменения делал в рамках изучения как самой Unity, так и языка программирования C# (си шарп). Ниже выкладываю скрипты и материалы, которые были использованы для этого этапа обучения.

Скачать материалы TwelveMonkeys.rar для Unity
Скачать игру Twelve Monkeys для Android

Скрипт Rotator.cs вращает кубики вокруг своей оси

using UnityEngine;
using System.Collections;

public class Rotator : MonoBehaviour
{
      void Update()
   {
      transform.Rotate(new Vector3(0f, 15f, 0f) * Time.deltaTime);
   }
}

Скрипт CameraController.cs держит камеру на определенном удалении от мяча, следит за ним

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour
{
    public GameObject player;
    private Vector3 offset;

    void Start()
    {
        offset = transform.position - player.transform.position;
    }
    void LateUpdate()
    {
        transform.position = player.transform.position + offset;
    }
}

Скрипт CreatePickUps.cs создаёт препятствия на игровом поле по кругу(тип 0) и по решетке(тип 1)

using UnityEngine;
using System.Collections;

public class CreatePickUps : MonoBehaviour {

    public GameObject PickUp;
    public Material[] MaterialsOfGround;
    public Material[] MaterialsPickUp;
    int numberOfObjects = 12;
    //for circle
    float radius = 6f;
    float hangle = 1f;
    float vangle = 1f;
    //for grid
    float gridX = 3f;
    float gridY = 4f;
    float spacing = 2f;
    private int rPickUp;

    void Start()
    {
        int type = 0;
        MeshRenderer mrGround = GameObject.Find("Ground").GetComponent();
        if (PlayerController.score > 0)
        {
            type = (int)Random.Range(0, 1);
            hangle = Random.Range(0.8f, 1.6f);
            vangle = Random.Range(0.8f, 1.6f);
            radius = Random.Range(1f, 9f);
        }
        if ( type == 0)
        {
            mrGround.material = MaterialsOfGround[type];
            for (int i = 0; i < numberOfObjects; i++)
            {
                MeshRenderer mrPickUp = PickUp.GetComponent();
                if (i == 3)
                {
                    mrPickUp.material = MaterialsPickUp[0];
                    PickUp.tag = "Enemy";
                }
                else 
                {
                    if (i==7) {
                        mrPickUp.material = MaterialsPickUp[1];
                        PickUp.tag = "Helper";
                    }
                    else {
                        mrPickUp.material = MaterialsPickUp[2];
                        PickUp.tag = "Pick Up";
                    }
                }
                float angle = i * Mathf.PI * 2 / numberOfObjects;
                Vector3 pos = new Vector3(Mathf.Cos(angle*hangle), 1.0f / radius, Mathf.Sin(angle*vangle)) * radius;
                Instantiate(PickUp, pos, Quaternion.identity);
            }
        }
        else
        {
            mrGround.material = MaterialsOfGround[type];
            MeshRenderer mrPickUp = PickUp.GetComponent();
            for (int y = 0; y < gridY; y++)
            {
                for (int x = 0; x < gridX; x++)
                {
                    if (x* gridY + y == 3)
                    {
                        mrPickUp.material = MaterialsPickUp[0];
                        PickUp.tag = "Enemy";
                    }
                    else
                    {
                        if (x * gridY + y == 7)
                        {
                            mrPickUp.material = MaterialsPickUp[1];
                            PickUp.tag = "Helper";
                        }
                        else
                        {
                            mrPickUp.material = MaterialsPickUp[2];
                            PickUp.tag = "Pick Up";
                        }
                    }
                    spacing = Random.Range(2f, 3f);
                    Vector3 pos = new Vector3((x - gridX/3) * hangle, 1.0f / spacing, (y - gridY/2) * vangle + 0.5f) * spacing;
                    Instantiate(PickUp, pos, Quaternion.identity);
                }
            }
        }
    }
}

Скрипт PlayerController.cs управляет движением шара и обрабатывает встречи его с препятствиями

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

[RequireComponent(typeof(AudioSource))]

public class PlayerController : MonoBehaviour
{
    public static float speed = 10;
    float dopspeed;
    public Text scoreText;
    private Rigidbody rb;
    public int count;
    public static int score=0;
    public static int life=3;
    public Texture Monkey;
    public Texture Left;
    public AudioClip enemySound,prefSound;
    AudioSource source;
    public GUISkin customSkin;   
    int ButtonW =200, ButtonH=60;

    void Start()
    {
        ButtonW = Screen.width / 5;
        ButtonH = Screen.height / 7;
        rb = GetComponent();
        source = GetComponent();
        source.loop = false;
        source.playOnAwake = false;
        dopspeed = 1f;
        count = 12;
        SetCountText();
    }

    void FixedUpdate()
    {
        Vector3 movement;

        if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer) 
        {
            if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
            {
                // Get movement of the finger since last frame
                Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;
                movement = new Vector3(touchDeltaPosition.x, 0.0f, touchDeltaPosition.y);
                rb.AddForce(movement * speed * dopspeed);
            }
        }
    else
        {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
        movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        rb.AddForce(movement * speed * dopspeed);
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Enemy"))
        {
            source.clip = enemySound;
            source.Play();
            life -= 1;
            if (life < 1)
            {
                GameOver();
            }
            else
            {
                CleaningScene();
            }
        }
        else
        {
            if (other.gameObject.CompareTag("Helper"))
                dopspeed = 3f;

            source.clip = prefSound;
            source.Play();
            Destroy(other.gameObject);
            count -= 1;
            score += 1;
            SetCountText();
        }
    }

    void OnGUI()
    {
        GUI.skin = customSkin;                    
        for (int i=0;i< count;i++) {
            GUI.DrawTexture(new Rect(2 + i*30, 2, 30, 30), Left, ScaleMode.ScaleAndCrop);
        }
        for (int i = 0; i < life; i++)
        {
            GUI.DrawTexture(new Rect(Screen.width-3*31 + i * 30, 2, 30, 30), Monkey, ScaleMode.ScaleAndCrop);
        }

        if (GUI.Button(new Rect(Screen.width - ButtonW-2, 32, ButtonW, ButtonH), "Quit"))
        {
            GameOver();                   
        }
    }
    void SetCountText()
    {
        scoreText.text = "Score: " + score.ToString();

        if (count <= 1)
        {
            count = 12;
            score += 1;
            speed = speed + 1;
            CleaningScene();
        }
    }

    void CleaningScene() {
        Application.LoadLevel(Application.loadedLevelName);
    }

    public void GameOver()
    {
        DontDestroyOnLoad(GameObject.Find("Ground"));
        DontDestroyOnLoad(GameObject.Find("East wall"));
        DontDestroyOnLoad(GameObject.Find("West wall"));
        DontDestroyOnLoad(GameObject.Find("South wall"));
        DontDestroyOnLoad(GameObject.Find("North wall"));
        DontDestroyOnLoad(GameObject.Find("Directional Light"));
        Application.LoadLevel("Win");
    }
}

Скрипт Menu.cs выводит и сохраняет таблицу результатов, обрабатывает выход из игры

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.IO;
using System.Linq;

public class Menu : MonoBehaviour {
    public GUIStyle welcomeLabel;
    public GUISkin customSkin;    
    int ButtonW = 200, ButtonH = 60;

    private string WinText;

    string[] lines;

    string[] names = new string[6];
    int[] scores = new int[6];

    string yourName="Your name";
    int yourScore;

    string Path;

    void Start() {
        bool Itsname;
        if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
            Path = Application.persistentDataPath;
        else {
            Path = "Data";
        }
        ButtonW = Screen.width / 5;
        ButtonH = Screen.height/7;
        yourScore = PlayerController.score;

        Load();
        Itsname = true;
        int j = 0;
        for (int i = 0; i < lines.Length; i++) 
            { if (Itsname) 
                 { names[j] = lines[i]; 
                   Itsname = !Itsname; 
                 } else 
                    { int.TryParse(lines[i], out scores[j]); 
                      Itsname = !Itsname; j += 1; 
                 } 
            } 
           } 
 
   void Sorting(){ 
        string A; int B; for (int j = 5; j >0; j--)
        {
            for (int i = 0; i < j; i++)
            {
                if (scores[i] < scores[i + 1])
                {
                    B = scores[i];
                    scores[i] = scores[i + 1];
                    scores[i + 1] = B;
                    A = names[i];
                    names[i] = names[i + 1];
                    names[i + 1] = A;
                }
            }
        }
    }

    void Save(){
        if (!Directory.Exists(Path))
            Directory.CreateDirectory(Path);

        names[5] = yourName;
        scores[5] = yourScore;
        Sorting();
        string[] linesOut = new string[12];

        for (int i = 0; i <= 5; i++) { 
            linesOut[i*2] = names[i]; 
            linesOut[i * 2 + 1] = scores[i].ToString(); } 
           //закоментировал для Web варианта 
           //File.WriteAllLines(Path+"/rezult.rz", linesOut); } 

   void Load() { 
       if (!Directory.Exists(Path)) { 
           Directory.CreateDirectory(Path); } 
          else { 
             lines = File.ReadAllLines(Path+"/rezult.rz"); } 
             } 

   void OnGUI() { 
       if (PlayerController.life == 0) { 
            WinText = "Game over!!"; } 
           else { 
              WinText = "HIGH SCORE TAB"; } 
       GUI.Label(new Rect(Screen.width / 2- WinText.Length*10/2, 10, WinText.Length * 10, 20), WinText, welcomeLabel); 
       GUI.skin = customSkin; 
       if (GUI.Button(new Rect(2, ButtonH+2, ButtonW, ButtonH), "Continue")) { 
           if (PlayerController.life == 0) { 
               PlayerController.life = 3; 
               PlayerController.score = 0; 
         } 
         Destroy(GameObject.Find("Ground")); 
         Destroy(GameObject.Find("Directional Light"));  
         Application.LoadLevel("Mini game"); } 
       if (GUI.Button(new Rect(Screen.width - ButtonW-2, ButtonH+2, ButtonW, ButtonH), "Quit")) { 
           Application.Quit(); } 
       int j = 0; 
       if (names!=null) { 
           foreach (string name in names) { 
                 string stroka = name + "..........." + scores[j]; 
                 GUI.Label(new Rect(Screen.width / 2- stroka.Length*8/2, 50 + j * 30, stroka.Length*10, 20), stroka, welcomeLabel); 
                 j += 1; } } 
       if (yourScore> scores[0]) {
            string stroka1 = "Your score: " + yourScore.ToString();
            GUI.Label(new Rect(Screen.width / 2- stroka1.Length*11, 50 + 7 * 30, 50, 20), stroka1, welcomeLabel);
            yourName = GUI.TextField(new Rect(Screen.width / 2, 50 + 7 * 30, 190, 30), yourName,10);
            if (GUI.Button(new Rect(Screen.width / 2 + 200, 50 + 7 * 30, 60, 30), "Save")) {
                Save();}
        }
    }
}

Комментариев нет »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Для отправки комментария вам необходимо авторизоваться.