Урок №3 по FPS от "AIDEN" - Форум Игроделов
Пн, 06 Май 2024, 07:35 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » МАНУАЛЫ И УРОКИ » Урок №3 по FPS от "AIDEN" (Урок по созданию : Радара, фонарика, прицела и т.д... .)
Урок №3 по FPS от "AIDEN"
AIDENДата: Пт, 28 Июн 2013, 15:12 | Сообщение # 1
Нет аватара
 
Сообщений: 59
Награды: 0
Репутация: 56
Статус: Offline
( ПКМ- правая кнопка мыши ).
(ЛКМ- левая кнопка мыши ).

Всем привет!
Наконец-то вышел наш 3 урок по созданию игр на профессиональном движке Unity 3D. Сегодня мы постараемся сделать :
-1.Радар ,
-2.Прицел,
-3.Фонарик, ,
-4.Пометки игроков на радаре ( типа : у игрока – зелёный (но наверное лучше синий), а у бота – красный значок на радаре), 5.Поинты ( точки к которым нужно будет идти нашему игроку для прохождения миссии).

1.Первое что мы сделаем, это “Радар”.
Для начала создадим вторую камеру (для нашего радара ). В меню Unity нажмите Game Object->Create Other->Camera, назовём её “CameraRadar”.
Теперь сделаем так, чтобы камера была точно над игроком. Для этого все значения позиции вашего игрока “First Person Controller, или Player” скопируем и вставим камере, для этого нажмите : На самого игрока (чтобы он выделился в окне “Inspector” ), и там где написано “Transform”, скопируйте значения под названием “Position“ ( скопировать Ctrl+S, или ПКМ->Copy ), и вставьте туда-же, только в свойства камеры радара “CameraRadar”.
Теперь в свойствах камеры радара ( в окне Inspector ) укажем угол поворота : в свойствах Transform, под вкладкой Rotation, там где “x” поставим вместо “0” , “90”.
Поднимите камеру выше своего игрока, так чтобы его было еле видно. Теперь в окне Inspector, в свойствах камеры радара, во вкладке “Camera” делаем следушие настройки : там где “Depth” ставим вместо “0”, “1”. Настраиваем камеру так, чтобы она была в углу камеры игрока ( У меня так : там где “Normalized View Port Rect” , где “X” - ставим 0.81, там где “W”- 0.17, где “Y”-0.67, “H”- 0.3 ).
Ну примерно вот-так :



Сейчас надо добавить камеру радара, к нашему игроку (Для этого просто перетяните “CameraRadar” на вашего игрока в окошке ” Hierarchy” ). Вот и готов наш радар (почти), нам ещё осталось сделать рамку для радара. Для этого напишем шейдер. Чтобы его написать, нажмите ПКМ в окне “Project” Create->Shader, назовём “MiniMap” , откроем его, удалим всё что есть сейчас в шейдере, и впишем :

Код
Shader "Custom/MiniMap" {
     Properties {
     _MainTex ("Main Texture", 2D) = "white" {}
     _Mask ("Mask Texture", 2D) = "white" {}
     }
     SubShader
     {
     Tags { "Queue"="Transparent"}
     Lighting On
     ZWrite Off
     Blend SrcAlpha OneMinusSrcAlpha
         
     Pass {
         
     SetTexture [_Mask] {combine texture}
         
     SetTexture [_MainTex] {combine texture, previous}
     }
     }
     }


Сохраним его.
Теперь напишем ещё скрипт C# (в предыдущих уроках я вам рассказывал как это делать ), создадим скрипт, назовём его GUIManagers, откроем его, и напишем :

Код
using UnityEngine;
using System.Collections;

public class GUIManagers : MonoBehaviour {
public Material MiniMapMaterial;
     public RenderTexture MiniMapTexture;
     private float offset;
     void Awake(){
          
      offset = 10;
     }
     void OnGUI() {
      if(Event.current.type ==EventType.Repaint)
      Graphics.DrawTexture(new Rect(Screen.width - 250 - offset, offset, 230, 230), MiniMapTexture, MiniMapMaterial);
     }
}


Сохраним. Добавим скрипт к камере радара.
Теперь надо сделать Render Texture, для этого : в окне Project, ПКМ- Create-> Render Texture, назовём его “MiniMapTexture”.
Теперь нам надо создать самую рамку ( в какой-то программе, типа Adobe Photoshop, Paint, Pain.NET…), я создам в программе Pain.NET. Получилась вот такая рамка.



Когда мы создали рамку, нам надо создать Plane ( Плоскость ) , для этого : GameObject->CreateOther->Plane,создали мы плоскость, теперь поднимим её высоко над землёю, и перетащим нашу рамку (ту которую мы делали) на Plane.
Перетащим Plan - на CameraRadar ( камера радар ). Перетащим наш шейдер “MiniMap” на свойство “Shader” ( внизу ) свойств Plane, и выберем, там где Main Texture -“MiniMapTexture”, там где “Mask Texture” – нашу рамку.
В свойствах камеры радара, в вкладке “Camera” там где Target Texture, выбираем нашу Render Texture- “MiniMapTexture”.
Теперь к камере радара добавим компонент : Component->Camera Control->Smooth Follow.
И выставим следующие значения в этом скрипте : Там где написано Target указываем нашего игрока, Distance = 20, Height = 90, всё остальное оставляем на месте. А в скрипте “GUIManagers” ( в этой же камере ), там где MiniMapMaterial указываем материал из нашей рамки ( после добавления текстуры рамки , к Plane, то там где находится ваша рамка в окне Project, появится папка “Materials”), укажите этот материал ,MiniMapTexture указываем Render Texture “MiniMapTexture”.
Опять в свойствах камеры радара, в вкладке “Camera” там где “Normalized View Port Rect” , где “X” - ставим 0, там где “W”- 1, где “Y”-0, “H”- 1 ).
Ну вроде бы и всё, закончили мы с этим радаром. Здесь новичкам (и не только) будет сложно разобраться, так что задавайте вопросы, я вам с радостью отвечу.

2.Теперь создадим отличный прицел. Создадим Java Script , назовём его Crosshair, и напишем :
Код

     @script ExecuteInEditMode()     
     enum preset { Standart, ShotGun, Crysis } //Выбираем тип прицела
     var timesActive : float = 1;//Я сделал эту функцию, чтобы когда прицеливаешься он пропадал (ПКМ, если у вас есть)//при отпускании прицела, Crosshair появлялся только через 1 сек, значение можно менять в окне Inspector в Unity.
     var crosshairPreset : preset = preset.Standart;     
           
     var showCrosshair : boolean = true;     
     var verticalTexture : Texture; //Указываем текстуру которая будет отображаться вертикально     
     var horizontalTexture : Texture; //Указываем текстуру которая будет отображаться горизонтально      

           
     //Size of boxes     
     var cLength : float = 10; //Регулирует длину прицела
     var cWidth : float = 3; //Регулирует ширину прицела
           
     //Spreed setup     
     var minSpread : float = 45.0; //Минимальное  с-ужение прицела     
     var maxSpread : float = 250.0; //Минимальное  расширение прицела
     var spreadPerSecond : float = 150.0; //Скорость восстановления прицела к нормальному (минимальному).     
           
     //Rotation     
     var rotAngle : float = 0.0; //В какую сторону будет крутится прицел     
     var rotSpeed : float = 0.0; //С какой скоростью он будет крутиться     
         
         
           
     private var temp : Texture;     
     private var spread : float;     
           
     function Update(){     
     if(Input.GetMouseButtonDown(1)){
showCrosshair = false;
}
     if(Input.GetMouseButtonUp(1)){
     Invoke("ActiveCrosshair", timesActive);
}
             //Used just for test (weapon script should change spread).     
             if(Input.GetMouseButton(0)) spread += spreadPerSecond * Time.deltaTime;      
             else spread -= spreadPerSecond * 2 * Time.deltaTime;         
                  
             //Rotation     
             rotAngle += rotSpeed * Time.deltaTime;      
     }     
         
     function ActiveCrosshair () {
     showCrosshair = true;
     }
           
     function OnGUI(){     
             if(showCrosshair && verticalTexture && horizontalTexture){     
                     var verticalT = GUIStyle();     
                     var horizontalT = GUIStyle();     
                     verticalT.normal.background = verticalTexture;     
                     horizontalT.normal.background = horizontalTexture;     
                     spread = Mathf.Clamp(spread, minSpread, maxSpread);     
                     var pivot : Vector2 = Vector2(Screen.width/2, Screen.height/2);     
                          
                     if(crosshairPreset == preset.Crysis){     
                        
                             GUI.Box(Rect((Screen.width - 2)/2, (Screen.height - spread)/2 - 14, 2, 14), temp, horizontalT);     
                             GUIUtility.RotateAroundPivot(45,pivot);     
                             GUI.Box(Rect((Screen.width + spread)/2, (Screen.height - 2)/2, 14, 2), temp, verticalT);     
                             GUIUtility.RotateAroundPivot(0,pivot);     
                             GUI.Box(Rect((Screen.width - 2)/2, (Screen.height + spread)/2, 2, 14), temp, horizontalT);     
                     }     
                          
                     if(crosshairPreset == preset.ShotGun){     
                          
                             GUIUtility.RotateAroundPivot(45,pivot);     
                        
                             //Horizontal     
                             GUI.Box(Rect((Screen.width - 14)/2, (Screen.height - spread)/2 - 3, 14, 3), temp, horizontalT);     
                             GUI.Box(Rect((Screen.width - 14)/2, (Screen.height + spread)/2, 14, 3), temp, horizontalT);     
                             //Vertical     
                             GUI.Box(Rect((Screen.width - spread)/2 - 3, (Screen.height - 14)/2, 3, 14), temp, verticalT);     
                             GUI.Box(Rect((Screen.width + spread)/2, (Screen.height - 14)/2, 3, 14), temp, verticalT);     
                     }     
                          
                     if(crosshairPreset == preset.Standart){     
                          
                             GUIUtility.RotateAroundPivot(rotAngle%360,pivot);     
                        
                             //Horizontal     
                             GUI.Box(Rect((Screen.width - cWidth)/2, (Screen.height - spread)/2 - cLength, cWidth, cLength), temp, horizontalT);     
                             GUI.Box(Rect((Screen.width - cWidth)/2, (Screen.height + spread)/2, cWidth, cLength), temp, horizontalT);     
                             //Vertical     
                             GUI.Box(Rect((Screen.width - spread)/2 - cLength, (Screen.height - cWidth)/2, cLength, cWidth), temp, verticalT);     
                             GUI.Box(Rect((Screen.width + spread)/2, (Screen.height - cWidth)/2, cLength, cWidth), temp, verticalT);     
                     }     
             }     
     }


Сохраним его. Перетащим этот скрипт на камеру игрока. И укажем текстуры, и другое (я объяснил это в скрипте ).

3.Начнём с того , что создадим файл скрипта, для этого : в окошке Project (нажмём ПКМ на пустое место в этом окне и выберем Create->JavaScript) в окне Project появится файл с JavaScript.Назовём его “Spot Light” и приступим к его написанию. Откройте этот скрипт Spot Light. Удаляем всё что есть сейчас в скрипте. И пишем :

Код
//Я немного объясню этот скрипт     
     var SpotLight: Light; //Это переменная  “var“ , используется для хранения ссылки на объект. В этом случае ссылка установлена на свет  “ Light “.Здесь указывается тот объект, который должен выполнять какое-то действие, и отображаться в окне Inspector (для его дальнейшей настройки).     
     function Update  () { //Функция постоянного присутствия чего-то в игре.       
     if (Input.GetKeyDown(KeyCode.F))//Проверка(если нажата кнопка F, выполняется следующе действие).
     { //Скобки которые открывают , или закрывают какое-то действие     
     SpotLight.enabled = ! SpotLight.enabled;//Это означает : “SpotLight“ противоположно “! SpotLight“.В том смысле что если свет Spot Light включен, то при повторном нажатие на кнопку F действие будет сделано наоборот( выключен).       
      }     
     }


Всё, мы написали скрипт. Теперь сохраним скрипт нажав Ctrl+S ( роботает только на английской розкладке клавиатуры!) или File->Save.
Теперь создадим свет. Для этого откроем Unity 3D и нажмём : Game Object->Create Other-> Spot Light .Теперь настроим свет, и сделаем дочерним к игроку. Настройте свет чтобы он был на уровне глаз игрока, и в ту сторону в которую смотрит камера.



Когда настроете, включите игру и проверте( видно ли вам свет).
Если да, то перекинте объект Spot Light на файл вашего игрока, в объект "Main Camera" в окне Hierarchy ( чтобы свет стал дочерним к камере тгрока).
Теперь сделаем так, чтобы кнопка вкл/выкл света, кнопка F сработала. Для этого зайдите в : Edit->Project Settings->Input, откройте вкладку Axes и установите в значении Size на 1 число больше чем было раньше. И обновите (нажмите 2 раза по вкладке Axes).Поменяйте значения в последней открывшийся вкладке.Name-SpotLight , Positive Button – F.
Теперь перетащите наш скрипт на вашего игрока, и в окне Inspector, в нашем скрипте перетащите на свойство Spot Light наш установлен ранее свет. Откройте игру. И проверите, ли всё работает.
Если вы хотите в начале игры сделать выключенным фонарик, тогда найдите в Hierarchy Spot Light, и выберите его. В окне Inspector снимите галочку с свойства Light.
Ещё, если кто не знает, как сделать фонарик более реалистичней (вокруг меньше света, а всередине больше ),
Просто в свойствах света ( Spot Light ), там где функция Light, на свойстве Cookies поставьте текстуру FlashLight, или другие етого типа. Если у вас нету этого эффекта, то у вас не загружен стандартний Assets. Что-бы загрузить их нажмите : Assets->Import Package->Light Cookies.
Вот сам скрипт фонарика :

Код

var SpotLight :  Light;
function Update  () {
if (Input.GetKeyDown(KeyCode.F)){
SpotLight.enabled = ! SpotLight.enabled;
}
}


Вроде всё, фонарик создан. Проверьте его работоспособность - запустив игру.

4.Попробуем создать отметки на радаре. Сначала создадим плоскость (Plane), для этого : GameObject->CreateOther->Plane.Назовём её “PlayerAndEnemyPoint”. Теперь скопируйте все значения позиции вашего игрока, и вставим их, нашей плоскости “PlayerAndEnemyPoint”, та как мы делали с камерой радара ( в этом уроке, чуть выше ), теперь поднимите плоскость выше игрока (примерно в 2 раза ). Перекиньте на эту плоскость текстуру игрока , которая будет отображается на радаре (это может быть : какая-то звёздочка, кружочек, стрелка, ну впрочем всё что вы пожелаете).
Давайте для примера создадим простой кружочек для нашего игрока. Я создам его в программе Paint.NET. Как-то так.



Сохраним текстуру в папку вашего проекта ( у меня например : C:\Users\Админ\Documents\1GameForWindows ), или можно импортировать файлы с компа, просто нажав в меню Unity : Assets->Import New Assets.
Теперь можно и перекинуть нашу текстуру на (Plane,- “PlayerAndEnemyPoint”). Теперь нужно указать шейдер. В окне Inspector, там где выбирать текстуру, есть вкладка “Shader”, нужно выбрать “Nature->Tree Creator Leaves Fast”. Осталось только перетащить “PlayerAndEnemyPoint”, на нашего игрока. Всё, можете запустить игру, и проверить правильно ли оно работает:).

5.Сейчас мы создадим, поинты для миссии.
Сначала нужно создать сферу (Sphere). Для этого нажмите в меню юнити GameObject->CreateOther->Sphere. Когда вы создадите сферу, перенесите её туда, где заканчивается ваша миссия ( ну в смысле : тебе надо куда-то прийти, за какое-то время, или что-то там ещё – туда, куда надо прийти поставить эту сферу ). Настроили мы место положения сферы, теперь создадим Java Script, и назовём его ”LevelLoadTrigger”, откроем, и впишем :
Код

var Level = 0;
var TextPlayer : GameObject;
var SoundLevelLoad : AudioClip;
var Times : float = 1;

function Start (){
TextPlayer.active = false;
}

function OnTriggerEnter ( collider : Collider ){
if(collider.gameObject.CompareTag("Player")){
audio.clip = SoundLevelLoad;
audio.Play();
TextPlayer.active = true;
Invoke("TimeSound", Times);
}
}

function TimeSound () {
Application.LoadLevel(Level);
TextPlayer.active = false;
}


Сохраним скрипт.
-Теперь перетащим скрипт ”LevelLoadTrigger” на нашу сферу.
Теперь в свойствах сферы, там где вкладка Sphere Collider, в свойстве Its Trigger, мы ставим галочку, а в Radius ставим - “5” ( свойство Radius отвечает за, как вы поняли, радиус этого объекта. Мы сделали так, что при входе игрока, с тегом “Player” , в этот радиус - активировалась функция загрузки уровня ).
Чуть не забыл, нам надо добавить компонент сфере,“Audio Source“, отметив сферу в окне “Hierarchy” Component->Audio->Audio Source.
Создадим “GUI Texture”, нажмите : GameObject->CreateOther->GUITexture, и сделайте его дочерним к объекту сферы ( перетащить GUITexture, на Sphere ).
Теперь надо опять открыть программу Pint.NET, и нарисовать текст ( типа "Good Work", Миссия выполнена ).
Сохраним картинку.
Откроем Unity, перетащим нашу картинку на GUITexture (в свойство “Texture”).
В нашем скрипте ( отметьте сферу (Sphere), в окне “Hierarchy”, найдите наш скрипт ”LevelLoadTrigger”), там где написано Level, указываем загружаемый уровень игры ( чтобы создать уровень игры : загрузите сцену с следующей миссией ( ну типа : сейчас загружена миссия 1, а надо загрузить миссия 2 ), загрузите свою вторую миссию, и нажмите в меню Unity : File->Build Settings, и нажимаем “Add Current”.
Посмотрите в окошке Build Settings, напротив вашей миссии 2, какое число стоит ( примером : 0, 1, 2, 3,4…… ), загрузите обратно сцену (миссия 1), вернёмся к скрипту там где Level, указываем то число, которое стоит в Build Settings, напротив вашего второго уровня ( примерно как на скриншоте ).



В этом скрипте, там где написано TextPlayer – указываем наш “GUI Texture”, там где SoundLevelLoad – звук, музыку ( типа : “Миссия пройдена” ), там где “Times” – время задержки на переход уровня, после того как игрок вошёл в радиус сферы ( Sphere ).
Ещё не всё:).
Теперь нужно создать Tag и Layer ( создать Tag : отметьте в окне “Hierarchy”, нашего игрока, и в окне инспектор в верху, выше от свойства Transform, есть вкладка “Tag”, нажмите на неё, высветится окошко с тегами, нажмите “Add Tag…”, открывшемуся окне, нажмите на вкладку “Tags”, и там где пустое место ( примером : Elements 1, 2, 3.), напишем “Player”, и в этом же меню там где написано ( и пусто ), “User Layer 1, 2, 3…”, пишем Missy Point.
Всё, слои и теги готовы. Теперь отметим в “Hierarchy” игрока, и в вкладке Tag выберем “Player”, и отметим камеру радара ( в предыдущих уроках я росказывал о создании радара ) , в вкладке “Layer”, выбираем Missy Point. В опции “Camera”, там где Culling Mask, снимаем галочку с Missy Point ( это для того, чтобы текст приветствия “с прохождением миссии”, не отображался на радаре ).
Ещё об одном забыл : чтобы поинты просвечивались сквозь стены( типа как в Call Of Duty) , там где выбирать текстуры, где написано Shader, нажымаем на него, и выбираем : FX->Flare.

Всё! Запустите игру, и протестируйте.
Длинный был урок:)Не правда-ли:) Если что-то не понятно пишите, попробую объяснить:). В следующем уроке мы наконец то сделаем возможность стрелять нашему игроку. Если у вас есть модель рук с пистолетом ( или каким либо другим оружием (но желательно с пистолетом, так как я буду рассказывать именно об этом виде оружия ), если нет, - попытайтесь найти ( я не могу выставить свои модели, так как я сижу в интернете через МОДЕМ, и его скорость приёма не превышает (60 kbps). Так-что извините если что-то не так). Всем удачи, с своими игровыми проектами smile :) smile !

Очистил от флуда и оффТопа, отныне все вопросы только по теме описанной в уроке. (Левша).


Моя игра - Collect Fruit

Сообщение отредактировал AIDEN - Пт, 28 Июн 2013, 15:38
 
Сообщение( ПКМ- правая кнопка мыши ).
(ЛКМ- левая кнопка мыши ).

Всем привет!
Наконец-то вышел наш 3 урок по созданию игр на профессиональном движке Unity 3D. Сегодня мы постараемся сделать :
-1.Радар ,
-2.Прицел,
-3.Фонарик, ,
-4.Пометки игроков на радаре ( типа : у игрока – зелёный (но наверное лучше синий), а у бота – красный значок на радаре), 5.Поинты ( точки к которым нужно будет идти нашему игроку для прохождения миссии).

1.Первое что мы сделаем, это “Радар”.
Для начала создадим вторую камеру (для нашего радара ). В меню Unity нажмите Game Object->Create Other->Camera, назовём её “CameraRadar”.
Теперь сделаем так, чтобы камера была точно над игроком. Для этого все значения позиции вашего игрока “First Person Controller, или Player” скопируем и вставим камере, для этого нажмите : На самого игрока (чтобы он выделился в окне “Inspector” ), и там где написано “Transform”, скопируйте значения под названием “Position“ ( скопировать Ctrl+S, или ПКМ->Copy ), и вставьте туда-же, только в свойства камеры радара “CameraRadar”.
Теперь в свойствах камеры радара ( в окне Inspector ) укажем угол поворота : в свойствах Transform, под вкладкой Rotation, там где “x” поставим вместо “0” , “90”.
Поднимите камеру выше своего игрока, так чтобы его было еле видно. Теперь в окне Inspector, в свойствах камеры радара, во вкладке “Camera” делаем следушие настройки : там где “Depth” ставим вместо “0”, “1”. Настраиваем камеру так, чтобы она была в углу камеры игрока ( У меня так : там где “Normalized View Port Rect” , где “X” - ставим 0.81, там где “W”- 0.17, где “Y”-0.67, “H”- 0.3 ).
Ну примерно вот-так :



Сейчас надо добавить камеру радара, к нашему игроку (Для этого просто перетяните “CameraRadar” на вашего игрока в окошке ” Hierarchy” ). Вот и готов наш радар (почти), нам ещё осталось сделать рамку для радара. Для этого напишем шейдер. Чтобы его написать, нажмите ПКМ в окне “Project” Create->Shader, назовём “MiniMap” , откроем его, удалим всё что есть сейчас в шейдере, и впишем :

Код
Shader "Custom/MiniMap" {
     Properties {
     _MainTex ("Main Texture", 2D) = "white" {}
     _Mask ("Mask Texture", 2D) = "white" {}
     }
     SubShader
     {
     Tags { "Queue"="Transparent"}
     Lighting On
     ZWrite Off
     Blend SrcAlpha OneMinusSrcAlpha
         
     Pass {
         
     SetTexture [_Mask] {combine texture}
         
     SetTexture [_MainTex] {combine texture, previous}
     }
     }
     }


Сохраним его.
Теперь напишем ещё скрипт C# (в предыдущих уроках я вам рассказывал как это делать ), создадим скрипт, назовём его GUIManagers, откроем его, и напишем :

Код
using UnityEngine;
using System.Collections;

public class GUIManagers : MonoBehaviour {
public Material MiniMapMaterial;
     public RenderTexture MiniMapTexture;
     private float offset;
     void Awake(){
          
      offset = 10;
     }
     void OnGUI() {
      if(Event.current.type ==EventType.Repaint)
      Graphics.DrawTexture(new Rect(Screen.width - 250 - offset, offset, 230, 230), MiniMapTexture, MiniMapMaterial);
     }
}


Сохраним. Добавим скрипт к камере радара.
Теперь надо сделать Render Texture, для этого : в окне Project, ПКМ- Create-> Render Texture, назовём его “MiniMapTexture”.
Теперь нам надо создать самую рамку ( в какой-то программе, типа Adobe Photoshop, Paint, Pain.NET…), я создам в программе Pain.NET. Получилась вот такая рамка.



Когда мы создали рамку, нам надо создать Plane ( Плоскость ) , для этого : GameObject->CreateOther->Plane,создали мы плоскость, теперь поднимим её высоко над землёю, и перетащим нашу рамку (ту которую мы делали) на Plane.
Перетащим Plan - на CameraRadar ( камера радар ). Перетащим наш шейдер “MiniMap” на свойство “Shader” ( внизу ) свойств Plane, и выберем, там где Main Texture -“MiniMapTexture”, там где “Mask Texture” – нашу рамку.
В свойствах камеры радара, в вкладке “Camera” там где Target Texture, выбираем нашу Render Texture- “MiniMapTexture”.
Теперь к камере радара добавим компонент : Component->Camera Control->Smooth Follow.
И выставим следующие значения в этом скрипте : Там где написано Target указываем нашего игрока, Distance = 20, Height = 90, всё остальное оставляем на месте. А в скрипте “GUIManagers” ( в этой же камере ), там где MiniMapMaterial указываем материал из нашей рамки ( после добавления текстуры рамки , к Plane, то там где находится ваша рамка в окне Project, появится папка “Materials”), укажите этот материал ,MiniMapTexture указываем Render Texture “MiniMapTexture”.
Опять в свойствах камеры радара, в вкладке “Camera” там где “Normalized View Port Rect” , где “X” - ставим 0, там где “W”- 1, где “Y”-0, “H”- 1 ).
Ну вроде бы и всё, закончили мы с этим радаром. Здесь новичкам (и не только) будет сложно разобраться, так что задавайте вопросы, я вам с радостью отвечу.

2.Теперь создадим отличный прицел. Создадим Java Script , назовём его Crosshair, и напишем :
Код

     @script ExecuteInEditMode()     
     enum preset { Standart, ShotGun, Crysis } //Выбираем тип прицела
     var timesActive : float = 1;//Я сделал эту функцию, чтобы когда прицеливаешься он пропадал (ПКМ, если у вас есть)//при отпускании прицела, Crosshair появлялся только через 1 сек, значение можно менять в окне Inspector в Unity.
     var crosshairPreset : preset = preset.Standart;     
           
     var showCrosshair : boolean = true;     
     var verticalTexture : Texture; //Указываем текстуру которая будет отображаться вертикально     
     var horizontalTexture : Texture; //Указываем текстуру которая будет отображаться горизонтально      

           
     //Size of boxes     
     var cLength : float = 10; //Регулирует длину прицела
     var cWidth : float = 3; //Регулирует ширину прицела
           
     //Spreed setup     
     var minSpread : float = 45.0; //Минимальное  с-ужение прицела     
     var maxSpread : float = 250.0; //Минимальное  расширение прицела
     var spreadPerSecond : float = 150.0; //Скорость восстановления прицела к нормальному (минимальному).     
           
     //Rotation     
     var rotAngle : float = 0.0; //В какую сторону будет крутится прицел     
     var rotSpeed : float = 0.0; //С какой скоростью он будет крутиться     
         
         
           
     private var temp : Texture;     
     private var spread : float;     
           
     function Update(){     
     if(Input.GetMouseButtonDown(1)){
showCrosshair = false;
}
     if(Input.GetMouseButtonUp(1)){
     Invoke("ActiveCrosshair", timesActive);
}
             //Used just for test (weapon script should change spread).     
             if(Input.GetMouseButton(0)) spread += spreadPerSecond * Time.deltaTime;      
             else spread -= spreadPerSecond * 2 * Time.deltaTime;         
                  
             //Rotation     
             rotAngle += rotSpeed * Time.deltaTime;      
     }     
         
     function ActiveCrosshair () {
     showCrosshair = true;
     }
           
     function OnGUI(){     
             if(showCrosshair && verticalTexture && horizontalTexture){     
                     var verticalT = GUIStyle();     
                     var horizontalT = GUIStyle();     
                     verticalT.normal.background = verticalTexture;     
                     horizontalT.normal.background = horizontalTexture;     
                     spread = Mathf.Clamp(spread, minSpread, maxSpread);     
                     var pivot : Vector2 = Vector2(Screen.width/2, Screen.height/2);     
                          
                     if(crosshairPreset == preset.Crysis){     
                        
                             GUI.Box(Rect((Screen.width - 2)/2, (Screen.height - spread)/2 - 14, 2, 14), temp, horizontalT);     
                             GUIUtility.RotateAroundPivot(45,pivot);     
                             GUI.Box(Rect((Screen.width + spread)/2, (Screen.height - 2)/2, 14, 2), temp, verticalT);     
                             GUIUtility.RotateAroundPivot(0,pivot);     
                             GUI.Box(Rect((Screen.width - 2)/2, (Screen.height + spread)/2, 2, 14), temp, horizontalT);     
                     }     
                          
                     if(crosshairPreset == preset.ShotGun){     
                          
                             GUIUtility.RotateAroundPivot(45,pivot);     
                        
                             //Horizontal     
                             GUI.Box(Rect((Screen.width - 14)/2, (Screen.height - spread)/2 - 3, 14, 3), temp, horizontalT);     
                             GUI.Box(Rect((Screen.width - 14)/2, (Screen.height + spread)/2, 14, 3), temp, horizontalT);     
                             //Vertical     
                             GUI.Box(Rect((Screen.width - spread)/2 - 3, (Screen.height - 14)/2, 3, 14), temp, verticalT);     
                             GUI.Box(Rect((Screen.width + spread)/2, (Screen.height - 14)/2, 3, 14), temp, verticalT);     
                     }     
                          
                     if(crosshairPreset == preset.Standart){     
                          
                             GUIUtility.RotateAroundPivot(rotAngle%360,pivot);     
                        
                             //Horizontal     
                             GUI.Box(Rect((Screen.width - cWidth)/2, (Screen.height - spread)/2 - cLength, cWidth, cLength), temp, horizontalT);     
                             GUI.Box(Rect((Screen.width - cWidth)/2, (Screen.height + spread)/2, cWidth, cLength), temp, horizontalT);     
                             //Vertical     
                             GUI.Box(Rect((Screen.width - spread)/2 - cLength, (Screen.height - cWidth)/2, cLength, cWidth), temp, verticalT);     
                             GUI.Box(Rect((Screen.width + spread)/2, (Screen.height - cWidth)/2, cLength, cWidth), temp, verticalT);     
                     }     
             }     
     }


Сохраним его. Перетащим этот скрипт на камеру игрока. И укажем текстуры, и другое (я объяснил это в скрипте ).

3.Начнём с того , что создадим файл скрипта, для этого : в окошке Project (нажмём ПКМ на пустое место в этом окне и выберем Create->JavaScript) в окне Project появится файл с JavaScript.Назовём его “Spot Light” и приступим к его написанию. Откройте этот скрипт Spot Light. Удаляем всё что есть сейчас в скрипте. И пишем :

Код
//Я немного объясню этот скрипт     
     var SpotLight: Light; //Это переменная  “var“ , используется для хранения ссылки на объект. В этом случае ссылка установлена на свет  “ Light “.Здесь указывается тот объект, который должен выполнять какое-то действие, и отображаться в окне Inspector (для его дальнейшей настройки).     
     function Update  () { //Функция постоянного присутствия чего-то в игре.       
     if (Input.GetKeyDown(KeyCode.F))//Проверка(если нажата кнопка F, выполняется следующе действие).
     { //Скобки которые открывают , или закрывают какое-то действие     
     SpotLight.enabled = ! SpotLight.enabled;//Это означает : “SpotLight“ противоположно “! SpotLight“.В том смысле что если свет Spot Light включен, то при повторном нажатие на кнопку F действие будет сделано наоборот( выключен).       
      }     
     }


Всё, мы написали скрипт. Теперь сохраним скрипт нажав Ctrl+S ( роботает только на английской розкладке клавиатуры!) или File->Save.
Теперь создадим свет. Для этого откроем Unity 3D и нажмём : Game Object->Create Other-> Spot Light .Теперь настроим свет, и сделаем дочерним к игроку. Настройте свет чтобы он был на уровне глаз игрока, и в ту сторону в которую смотрит камера.



Когда настроете, включите игру и проверте( видно ли вам свет).
Если да, то перекинте объект Spot Light на файл вашего игрока, в объект "Main Camera" в окне Hierarchy ( чтобы свет стал дочерним к камере тгрока).
Теперь сделаем так, чтобы кнопка вкл/выкл света, кнопка F сработала. Для этого зайдите в : Edit->Project Settings->Input, откройте вкладку Axes и установите в значении Size на 1 число больше чем было раньше. И обновите (нажмите 2 раза по вкладке Axes).Поменяйте значения в последней открывшийся вкладке.Name-SpotLight , Positive Button – F.
Теперь перетащите наш скрипт на вашего игрока, и в окне Inspector, в нашем скрипте перетащите на свойство Spot Light наш установлен ранее свет. Откройте игру. И проверите, ли всё работает.
Если вы хотите в начале игры сделать выключенным фонарик, тогда найдите в Hierarchy Spot Light, и выберите его. В окне Inspector снимите галочку с свойства Light.
Ещё, если кто не знает, как сделать фонарик более реалистичней (вокруг меньше света, а всередине больше ),
Просто в свойствах света ( Spot Light ), там где функция Light, на свойстве Cookies поставьте текстуру FlashLight, или другие етого типа. Если у вас нету этого эффекта, то у вас не загружен стандартний Assets. Что-бы загрузить их нажмите : Assets->Import Package->Light Cookies.
Вот сам скрипт фонарика :

Код

var SpotLight :  Light;
function Update  () {
if (Input.GetKeyDown(KeyCode.F)){
SpotLight.enabled = ! SpotLight.enabled;
}
}


Вроде всё, фонарик создан. Проверьте его работоспособность - запустив игру.

4.Попробуем создать отметки на радаре. Сначала создадим плоскость (Plane), для этого : GameObject->CreateOther->Plane.Назовём её “PlayerAndEnemyPoint”. Теперь скопируйте все значения позиции вашего игрока, и вставим их, нашей плоскости “PlayerAndEnemyPoint”, та как мы делали с камерой радара ( в этом уроке, чуть выше ), теперь поднимите плоскость выше игрока (примерно в 2 раза ). Перекиньте на эту плоскость текстуру игрока , которая будет отображается на радаре (это может быть : какая-то звёздочка, кружочек, стрелка, ну впрочем всё что вы пожелаете).
Давайте для примера создадим простой кружочек для нашего игрока. Я создам его в программе Paint.NET. Как-то так.



Сохраним текстуру в папку вашего проекта ( у меня например : C:\Users\Админ\Documents\1GameForWindows ), или можно импортировать файлы с компа, просто нажав в меню Unity : Assets->Import New Assets.
Теперь можно и перекинуть нашу текстуру на (Plane,- “PlayerAndEnemyPoint”). Теперь нужно указать шейдер. В окне Inspector, там где выбирать текстуру, есть вкладка “Shader”, нужно выбрать “Nature->Tree Creator Leaves Fast”. Осталось только перетащить “PlayerAndEnemyPoint”, на нашего игрока. Всё, можете запустить игру, и проверить правильно ли оно работает:).

5.Сейчас мы создадим, поинты для миссии.
Сначала нужно создать сферу (Sphere). Для этого нажмите в меню юнити GameObject->CreateOther->Sphere. Когда вы создадите сферу, перенесите её туда, где заканчивается ваша миссия ( ну в смысле : тебе надо куда-то прийти, за какое-то время, или что-то там ещё – туда, куда надо прийти поставить эту сферу ). Настроили мы место положения сферы, теперь создадим Java Script, и назовём его ”LevelLoadTrigger”, откроем, и впишем :
Код

var Level = 0;
var TextPlayer : GameObject;
var SoundLevelLoad : AudioClip;
var Times : float = 1;

function Start (){
TextPlayer.active = false;
}

function OnTriggerEnter ( collider : Collider ){
if(collider.gameObject.CompareTag("Player")){
audio.clip = SoundLevelLoad;
audio.Play();
TextPlayer.active = true;
Invoke("TimeSound", Times);
}
}

function TimeSound () {
Application.LoadLevel(Level);
TextPlayer.active = false;
}


Сохраним скрипт.
-Теперь перетащим скрипт ”LevelLoadTrigger” на нашу сферу.
Теперь в свойствах сферы, там где вкладка Sphere Collider, в свойстве Its Trigger, мы ставим галочку, а в Radius ставим - “5” ( свойство Radius отвечает за, как вы поняли, радиус этого объекта. Мы сделали так, что при входе игрока, с тегом “Player” , в этот радиус - активировалась функция загрузки уровня ).
Чуть не забыл, нам надо добавить компонент сфере,“Audio Source“, отметив сферу в окне “Hierarchy” Component->Audio->Audio Source.
Создадим “GUI Texture”, нажмите : GameObject->CreateOther->GUITexture, и сделайте его дочерним к объекту сферы ( перетащить GUITexture, на Sphere ).
Теперь надо опять открыть программу Pint.NET, и нарисовать текст ( типа "Good Work", Миссия выполнена ).
Сохраним картинку.
Откроем Unity, перетащим нашу картинку на GUITexture (в свойство “Texture”).
В нашем скрипте ( отметьте сферу (Sphere), в окне “Hierarchy”, найдите наш скрипт ”LevelLoadTrigger”), там где написано Level, указываем загружаемый уровень игры ( чтобы создать уровень игры : загрузите сцену с следующей миссией ( ну типа : сейчас загружена миссия 1, а надо загрузить миссия 2 ), загрузите свою вторую миссию, и нажмите в меню Unity : File->Build Settings, и нажимаем “Add Current”.
Посмотрите в окошке Build Settings, напротив вашей миссии 2, какое число стоит ( примером : 0, 1, 2, 3,4…… ), загрузите обратно сцену (миссия 1), вернёмся к скрипту там где Level, указываем то число, которое стоит в Build Settings, напротив вашего второго уровня ( примерно как на скриншоте ).



В этом скрипте, там где написано TextPlayer – указываем наш “GUI Texture”, там где SoundLevelLoad – звук, музыку ( типа : “Миссия пройдена” ), там где “Times” – время задержки на переход уровня, после того как игрок вошёл в радиус сферы ( Sphere ).
Ещё не всё:).
Теперь нужно создать Tag и Layer ( создать Tag : отметьте в окне “Hierarchy”, нашего игрока, и в окне инспектор в верху, выше от свойства Transform, есть вкладка “Tag”, нажмите на неё, высветится окошко с тегами, нажмите “Add Tag…”, открывшемуся окне, нажмите на вкладку “Tags”, и там где пустое место ( примером : Elements 1, 2, 3.), напишем “Player”, и в этом же меню там где написано ( и пусто ), “User Layer 1, 2, 3…”, пишем Missy Point.
Всё, слои и теги готовы. Теперь отметим в “Hierarchy” игрока, и в вкладке Tag выберем “Player”, и отметим камеру радара ( в предыдущих уроках я росказывал о создании радара ) , в вкладке “Layer”, выбираем Missy Point. В опции “Camera”, там где Culling Mask, снимаем галочку с Missy Point ( это для того, чтобы текст приветствия “с прохождением миссии”, не отображался на радаре ).
Ещё об одном забыл : чтобы поинты просвечивались сквозь стены( типа как в Call Of Duty) , там где выбирать текстуры, где написано Shader, нажымаем на него, и выбираем : FX->Flare.

Всё! Запустите игру, и протестируйте.
Длинный был урок:)Не правда-ли:) Если что-то не понятно пишите, попробую объяснить:). В следующем уроке мы наконец то сделаем возможность стрелять нашему игроку. Если у вас есть модель рук с пистолетом ( или каким либо другим оружием (но желательно с пистолетом, так как я буду рассказывать именно об этом виде оружия ), если нет, - попытайтесь найти ( я не могу выставить свои модели, так как я сижу в интернете через МОДЕМ, и его скорость приёма не превышает (60 kbps). Так-что извините если что-то не так). Всем удачи, с своими игровыми проектами smile :) smile !

Очистил от флуда и оффТопа, отныне все вопросы только по теме описанной в уроке. (Левша).

Автор - AIDEN
Дата добавления - 28 Июн 2013 в 15:12
Форум Игроделов » UNITY3D » МАНУАЛЫ И УРОКИ » Урок №3 по FPS от "AIDEN" (Урок по созданию : Радара, фонарика, прицела и т.д... .)
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024