• avatar Boris
  • 0
*сервис
  • avatar Boris
  • 0
спасибо большое за статью, а какой сервер мощнее? тот, за каким сидит программист? :)
  • avatar Boris
  • 0
а почему уже нет? есть лучшие варианты?
  • avatar Andrey
  • 1
Тем, кто мне в личке спрашивал подсветку объекта, пишу здесь, может ещё кому пригодится.
Если хотите подсветку в своей игре, нужно изменить код из урока:
Создать префаб MyBlockBlue, с тегом BlockBlue, с материалом mat_Blue.Создать префаб MyBlockRed,c тегом BlockRed, с материалом mat_Red.
код:
/*
Author: afrokick /edited unknown
Forum: www.blog.devby.ru
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Controller: MonoBehaviour{

public GameObject blockblue;
public GameObject blockred;
public Material mat_blue;
public Material mat_red;
bool goblockblue = true;
bool goblockred;

void Start(){
LoadBlocks();
Screen.showCursor = false;
Screen.lockCursor = true;//привязываем курсор к центру экрана
}
void Update(){
Ray ray = Camera.mainCamera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 10f) && hit.collider.CompareTag(«BlockBlue»)
|| Physics.Raycast(ray, out hit, 10f) && hit.collider.CompareTag(«BlockRed»))
// если луч сталкивается с объектами под тегом BlockBlue и BlockRed, то…
{
if (Input.GetMouseButtonUp(0)) //… если нажата левая мышь…
{
if (goblockblue) //… если разрешено создание синего блока…
{ Vector3 pos = hit.collider.transform.position;
pos += hit.normal;
Instantiate(blockblue, pos, Quaternion.identity);//… то создаём синий,
}
if (goblockred) // если разрешено создание красного блока…
{ Vector3 pos = hit.collider.transform.position;
pos += hit.normal;
Instantiate(blockred, pos, Quaternion.identity);//… то создаём красный.
}
}
else if (Input.GetMouseButtonUp(1))
{
DestroyObject(hit.collider.gameObject);
}
}
else if (Physics.Raycast(ray, out hit, 10f) && hit.collider.name.Equals(«Plane»))
{
if (Input.GetMouseButtonUp(0))
{
if (goblockblue)
{ Vector3 pos = hit.point;
pos.y = 0;
pos.x = Mathf.Round(pos.x);
pos.z = Mathf.Round(pos.z);
Instantiate(blockblue, pos, Quaternion.identity);
}
if (goblockred)
{ Vector3 pos = hit.point;
pos.y = 0;
pos.x = Mathf.Round(pos.x);
pos.z = Mathf.Round(pos.z);
Instantiate(blockred, pos, Quaternion.identity);
}
}
}
}
void OnGUI()
{
if (Input.GetKey(KeyCode.M))
{ Screen.showCursor = true;
Screen.lockCursor = false;
GUILayout.BeginVertical();
if (GUILayout.Button(«Blue»)) //если нажата кнопка «Blue»
{
goblockblue = true; // разрешаем создание синего блока
goblockred = false; // запрещаем создание красного
}
if (GUILayout.Button(«Red»)) // если нажата кнопка «Red»
{
goblockblue = false; // запрещаем создание синего блока
goblockred = true; // разрешаем создание красного
}
GUILayout.EndVertical();
}
else{
Screen.showCursor = false;
Screen.lockCursor = true;
}
}
void OnApplicationQuit(){
SaveBlocks();
}
/// /// Для загрузки блоков
///
void LoadBlocks()
{ if (!PlayerPrefs.HasKey(«blocks1»))
return;
if (!PlayerPrefs.HasKey(«blocks2»))
return;
string strBlocks1 = PlayerPrefs.GetString(«blocks1»);
string strBlocks2 = PlayerPrefs.GetString(«blocks2»);
string[] masBlocks1 = strBlocks1.Split(new char[] { ';' }, System.StringSplitOptions.RemoveEmptyEntries);
string[] masBlocks2 = strBlocks2.Split(new char[] { ';' }, System.StringSplitOptions.RemoveEmptyEntries);
foreach (string s in masBlocks1)
{ string[] masParam1 = s.Split(new char[] { '#' }, System.StringSplitOptions.RemoveEmptyEntries);
Vector3 pos = new Vector3(float.Parse(masParam1[0]), float.Parse(masParam1[1]), float.Parse(masParam1[2]));
Instantiate(blockblue, pos, Quaternion.identity);
}
foreach (string s in masBlocks2)
{ string[] masParam2 = s.Split(new char[] { '#' }, System.StringSplitOptions.RemoveEmptyEntries);
Vector3 pos = new Vector3(float.Parse(masParam2[0]), float.Parse(masParam2[1]), float.Parse(masParam2[2]));
Instantiate(blockred, pos, Quaternion.identity);
}
}
void SaveBlocks()
{ GameObject[] allBlocks1 = GameObject.FindGameObjectsWithTag(«BlockBlue»);//1 — синий
GameObject[] allBlocks2 = GameObject.FindGameObjectsWithTag(«BlockRed»);//2 — красный
string saveStr1 = "";
string saveStr2 = "";
foreach (GameObject g in allBlocks1)
{ Vector3 pos = g.transform.position;
saveStr1 += string.Format("{0}#{1}#{2}#{3};", pos.x, pos.y, pos.z,(mat_blue));
}
PlayerPrefs.SetString(«blocks1», saveStr1);
PlayerPrefs.Save();
foreach (GameObject g in allBlocks2)
{ Vector3 pos = g.transform.position;
saveStr2 += string.Format("{0}#{1}#{2}#{3};", pos.x, pos.y, pos.z, (mat_red));
}
PlayerPrefs.SetString(«blocks2», saveStr2);
PlayerPrefs.Save();
}
}
=================================================================
Код выделения объекта цветом при наведении курсора.Повесить на объекты, которые нужно выделять.Цвет выбирается в инспекторе.

using UnityEngine;
using System.Collections;
public class SelectColor: MonoBehaviour{
public Color myColor;
Color OriginalColor;
void Start(){
OriginalColor = renderer.material.color;
}
void OnMouseEnter (){
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 10f)){
renderer.material.color = myColor;
}
}
void OnMouseExit (){
renderer.material.color = OriginalColor;
}
}
  • avatar Andrey
  • 1
GUI.DrawTexture(new Rect (Screen.width — 155,Screen.height — 105,140,90), TexD);
Здесь минусы почему-то длинными получились, замените вручную: — 155 и — 105.
Или всю строку вручную. Выделение объекта у меня есть, скачал в интернете, только там надо дистанцию до объекта добавить, ну и потестить что к чему.Попозже выложу, если всё получится, а то я же сам новичёк :)
  • avatar Radelte
  • 0
У меня ошибку выдает
  • avatar Andrey
  • 0
Привязка курсора к центру экрана:
void Start(){
Screen.showCursor = false; //показать курсор = ложно
Screen.lockCursor = true; //курсор в центре экрана = истинно
}
А при нажатии кнопки «Инвентарь», делаешь наоборот. Отвязываешь курсор от центра и делаешь видимым, чтобы блоки выбирать.
— Смена GUI-текстуры:
public Texture2D TexD;
public Texture2D TexStone1;
void OnGUI(){
GUI.DrawTexture(new Rect (Screen.width — 155,Screen.height — 105,140,90), TexD);

if(GUI.Button(new Rect((Screen.width / 2)- 250, (Screen.height / 2)- 255, 50,50), stone1)){
TexD = TexStone1;
}
}
  • avatar Radelte
  • 0
Да и еще одно самое главное как сделать так чтобы мышь воздействовала только на игру. Просто когда например осматриваюсь в игре и нажимаю поставить блок. Открывается пуск и другие программы так как это исправить?
  • avatar Radelte
  • 0
За эти 2 совета выше

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

«Может нужна подсветка объекта? В Майнкрафте выделяется блок, на который поставится следующий. Это нужно?»

Да это тоже нужно.

Заранее спасибо
Насколько я помню, есть перегрузка метода SendEvent, в которой один из параметров принимает список получателей…
  • avatar Andrey
  • 0
"-Чтобы было видно блок, который ставишь"?
Может нужна подсветка объекта? В Майнкрафте выделяется блок, на который поставится следующий. Это нужно?
  • avatar Andrey
  • 0
Что значит «чтобы было видно картинку»? Если создание инвентаря, то в инете есть уроки. Здесь выше давали ссылку. Ну а если по простому, то вот:
public Texture2D Имя_текстуры;

if(GUI.Button(new Rect((Screen.width / 2)- 250, (Screen.height / 2)- 255, 50,50), Имя_текстуры))
{
block.renderer.sharedMaterial = mat_blue;
}

Меняем в коде из урока, кнопку с текстом, на кнопку с картинкой.
Screen.width / 2 — это нужно, чтобы на разных разрешениях мониторов кнопка не меняла своё местоположение.
  • avatar Andrey
  • 2
Новую игру можно так: Создаём новую сцену «Menu» и в ней на объект вешаем скрипт:
using UnityEngine;
using System.Collections;
public class Menu: MonoBehaviour {
void OnGUI(){
if(GUI.Button(new Rect((Screen.width / 2)- 25, (Screen.height / 2)- 60, 100,30), «Continue»))
{
Application.LoadLevel(«Game»); // Переходим в сцену «Game»
}
if(GUI.Button(new Rect((Screen.width / 2)- 25, (Screen.height / 2)- 28, 100,30), «NEW GAME»))
{
PlayerPrefs.DeleteAll(); // Очищаем Player Prefs
Application.LoadLevel(«Game»); // Переходим в сцену «Game»
}
}
}
  • avatar Radelte
  • 0
Да и нужно сделать чтобы при выборе блока было видно картинку как это сделать?
  • avatar Radelte
  • 0
Сделал как по уроку. Теперь встала задача. Как сделать так чтобы было видно блок который ставишь?
И еще как отчистить поле от блоков? Ну вроде начать новую игру.
  • avatar Andrey
  • 2
Skyden, спасибо за подсказку, но у меня не получается ей воспользоваться. Никак не пойму как это применить на практике. Может найдёте пару минут, добавите в этот код, чего там не хватает. Надеюсь, я не слишком многого прошу :) Для вас это пустячное дело, а мне будет урок и наглядный пример на всю оставшуюся жизнь!
код:
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(mat_container));
}
PlayerPrefs.SetString(«blocks», saveStr);
PlayerPrefs.Save();
}
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]));
Instantiate(block, pos, Quaternion.identity);
}
}
//(ID материала не нужно, у меня модели)
  • avatar Skyden
  • 1
hit.transform.eulerAngles — возвратит Vector3, в котроом x y z — это углы поворота, вот их и сохраняй.

Когда загрузишь, просто назначь новый поворот объекту с помощью hit.transform.eulerAngles = new Vector3(x,y,z);
  • avatar Kuim
  • 0
Когда продолжение будет?
Спасибо, я уже сам решил проблему. Просто была добавлена лишняя анимация при создании блока на сцене.
  • avatar Andrey
  • 0
anton_vas, на ваш вопрос невозможно ответить. Мы же не знаем что там у вас в игре понасовано. Попробуйте в инспекторе снимать галочки по очереди с тех скриптов, которые были добавлены. Без какого скрипта станет работать, значит в этом скрипте и ищите проблему.