Создание Minecraft

И так приступим.
1. Создаём Terraint(Terrain->Create Terrain)
2. Далее в Inspector называем его Plane(Обязательно.Иначе блоки ставится не будут)
3. Создаём папку в хиерархии(Правая кнопка мыши->Create->Folder)
4. Создаём в папке 2 материала и называем их как хотим(Правая кнопка мыши->Create->Material)
5. Создаём куб.В окне инспектора кубика выбираем Layer-Add Layer.Создаём Layer под именем Block.
6. Далее создаём в папке с материалами префаб (Правая кнопка мыши->Create->Prefab). И перетаскиваем наш кубик на это префаб. Теперь можете удалить кубик со сцены.
7. Теперь создаём C# скрипт (Правая кнопка мыши->Create->C# Script)

Вот и самое интересное:
Код
using UnityEngine;
using System.Collections;
using System.Collections.Generic; //Подключение библиотеки Unity.
public class Название вашего скрипта: MonoBehaviour
{
  public GameObject block;
  public Material mat_blue;
  public Material mat_red;

  // Use this for initialization
  void Start()
  {
  LoadBlocks();
  block.renderer.sharedMaterial = mat_blue;//new
  Screen.showCursor = false;
  }

   
  void Update()
  {
  Ray ray = Camera.mainCamera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
  RaycastHit hit;

  if (Physics.Raycast(ray, out hit, 5f) && hit.collider.CompareTag("Block"))
  {
  if (Input.GetMouseButtonUp(0))
  {
  Vector3 pos = hit.collider.transform.position;
  pos += hit.normal;

  Instantiate(block, pos, Quaternion.identity);
  }
  else if (Input.GetMouseButtonUp(1))
  {
  DestroyObject(hit.collider.gameObject);
  }
  }
  else if (Physics.Raycast(ray, out hit, 5f) && hit.collider.name.Equals("Plane"))
  {
  if (Input.GetMouseButtonUp(0))
  {
  Vector3 pos = hit.point;
  pos.y = 0;
  pos.x = Mathf.Round(pos.x);
  pos.z = Mathf.Round(pos.z);

  Instantiate(block, pos, Quaternion.identity);
  }
  }
  }

  void OnGUI()
  {
  if (Input.GetKey(KeyCode.M))
  {
  Screen.showCursor = true;

  GUILayout.BeginVertical();
  GUILayout.Label(block.renderer.sharedMaterial.name + "");

  if (GUILayout.Button("Blue"))
  {
  block.renderer.sharedMaterial = mat_blue;
  }
  if (GUILayout.Button("Red"))
  {
  block.renderer.sharedMaterial = mat_red;
  }
  GUILayout.EndVertical();
  }
  else
  {
  Screen.showCursor = false;
  }
  }

  void OnApplicationQuit()
  {
  SaveBlocks();
  }
  /// <summary>
  /// Для загрузки блоков
  /// </summary>
  void LoadBlocks()
  {
  //если нету записи, то выходим
  if (!PlayerPrefs.HasKey("blocks"))
  return;
  //получаем строку, содержащую все блоки
  string strBlocks = PlayerPrefs.GetString("blocks");
  //получаем массив блоков
  string[] masBlocks = strBlocks.Split(new char[] { ';' }, System.StringSplitOptions.RemoveEmptyEntries);
  //перебираем каждый блок
  foreach (string s in masBlocks)
  {
  //Массив параметров блока
  string[] masParam = s.Split(new char[] { '#' }, System.StringSplitOptions.RemoveEmptyEntries);
  //Позиция
  Vector3 pos = new Vector3(float.Parse(masParam[0]), float.Parse(masParam[1]), float.Parse(masParam[2]));
  //Тип материала
  byte matType = byte.Parse(masParam[3]);
  block.renderer.sharedMaterial = GetMatById(matType);
  //Добавляем блок на сцену
  Instantiate(block, pos, Quaternion.identity);
  }

  Debug.Log(string.Format("Загружено {0} блоков!", masBlocks.Length));
  }
  /// <summary>
  /// Для сохранения блоков
  /// </summary>
  void SaveBlocks()
  {
  //получаем все блоки на сцене
  GameObject[] allBlocks = GameObject.FindGameObjectsWithTag("Block");
  string saveStr = "";
  //берем каждый блок
  foreach (GameObject g in allBlocks)
  {
  //позиция блока
  Vector3 pos = g.transform.position;
  //записываем информацию о блоке в строку.
  saveStr += string.Format("{0}#{1}#{2}#{3};", pos.x, pos.y, pos.z, GetIdByMat(g.renderer.sharedMaterial));
  }
  //добавляем строку с блоками в хронилище
  PlayerPrefs.SetString("blocks", saveStr);
  //сохраняем!!!
  PlayerPrefs.Save();

  Debug.Log(string.Format("Сохранено {0} блоков", allBlocks.Length));
  }
  /// <summary>
  /// Возвращает ИД указанного материала
  /// </summary>
  /// <param name="m"></param>
  /// <returns></returns>
  byte GetIdByMat(Material m){
  switch (m.name)
  {
  case "mBlue":
  return 0;
  case "mRed":
  return 1;
  default:
  return 0;
  }
  }
  /// <summary>
  /// Возвращает Материал по ИД
  /// </summary>
  /// <param name="id"></param>
  /// <returns></returns>
  Material GetMatById(byte id)
  {
  switch (id)
  {
  case 0:
  return mat_blue;
  case 1:
  return mat_red;
  default:
  return mat_blue;
  }
  }
}

8. Конец урока.
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]