Воскресенье, 22 Сентября 2019, 14:53

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 14
  • 1
  • 2
  • 3
  • 13
  • 14
  • »
Форум игроделов » Записи участника » Alisher987 [270]
Результаты поиска
Alisher987Дата: Пятница, 02 Августа 2013, 17:22 | Сообщение # 1 | Тема: Разработка игр.Игровые движки.Инди Игры
участник
Сейчас нет на сайте
GameLoper, Я ЖИВОЙ!!!

Alisher987Дата: Четверг, 01 Августа 2013, 12:45 | Сообщение # 2 | Тема: Photon Server - новая серия уроков
участник
Сейчас нет на сайте
Эту ExitGames-Photon-Server-SDK_v3-2-10-4248.exe
или эту ExitGames-Photon-Server-SDK_v3-2-10-4248.7z


Alisher987Дата: Среда, 31 Июля 2013, 17:49 | Сообщение # 3 | Тема: Группировки.
участник
Сейчас нет на сайте
Adom, зачем по мере игры будет лучше если меня группы например диз баланс надо будет перейти ,а в игре не предусмотрено

Alisher987Дата: Среда, 31 Июля 2013, 17:29 | Сообщение # 4 | Тема: Группировки.
участник
Сейчас нет на сайте
Adom, сейчас минутку кажется где то я видел такие скрипты

скрипт вешаешь на камеру
вот настройка
короче создаешь Team A Spawn Points и Team B Spawn Points
Код


//This script handle logic inside room

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class RoomMultiplayerMenu : Photon.MonoBehaviour {

public GUISkin guiSkin;
public GameObject playerPrefab;
public Texture2D blackScreen;
public GameObject roomCamera;

//Setup available teams (This include team name and spawn points for each)
[System.Serializable]
public class AllTeams{
[HideInInspector]
public string teamName;
public List<Transform> spawnPoints;
}

public AllTeams team_1;
public AllTeams team_2;

[HideInInspector]
public Color team_1_Color = Color.cyan;
[HideInInspector]
public Color team_2_Color = Color.yellow;

[HideInInspector]
public bool isPaused;
GameObject enableHelper;

bool playerList;
Resolution[] resolutions;
string[] QualityNames;
int resolutionIndex = 3;
Vector2 scroll;
Vector2 scroll2;
Vector2 scroll3;

//Our player spawned
GameObject Player;

int fadeDir = 0;
float fadeValue;

//Update ping every 5 seconds
float updateRate = 5;
float nextUpdateTime = 0;

List<PhotonPlayer> allPlayers = new List<PhotonPlayer>();

//Join all spawn points for Dm mode
List<Transform> allSpawnPoints = new List<Transform>();

//Store round duration
int roundDuration;
float referenceTime;
//Round countdown
float currentRoundTime;
[HideInInspector]
public string gameMode;

bool roundEnded = false;

int team1Score = 0;
int team2Score = 0;

//Display this when round over
string finalText = "";

//Save first player name for Dm mode
string leadingPlayer;

//Sort players by kills
private static int SortPlayers(PhotonPlayer A, PhotonPlayer B){
if(B.customProperties["Kills"] != null && A.customProperties["Kills"] != null){
return (int)B.customProperties["Kills"] - (int)A.customProperties["Kills"];
}else{
return 0;
}
}

// Use this for initialization
void Awake () {
PhotonNetwork.isMessageQueueRunning = true;
isPaused = true;
resolutions = Screen.resolutions;
resolutionIndex = (resolutions.Length-1)/2;
QualityNames = QualitySettings.names;
playerList = true;
enableHelper = GameObject.FindWithTag("EnableHelper").gameObject;

//Setup team names ********************************
team_1.teamName = "Team A";
team_2.teamName = "Team B";
//Set player colors *********************************
team_1_Color = Color.cyan;
team_2_Color = Color.yellow;
//*********************************************

//Get round time
roundDuration = (int)PhotonNetwork.room.customProperties["RoundDuration"];
gameMode = (string)PhotonNetwork.room.customProperties["GameMode"];

//Setup all player properties
Hashtable setPlayerTeam = new Hashtable() {{"TeamName", "Spectators"}};
PhotonNetwork.player.SetCustomProperties(setPlayerTeam);

Hashtable setPlayerKills = new Hashtable() {{"Kills", 0}};
PhotonNetwork.player.SetCustomProperties(setPlayerKills);

Hashtable setPlayerDeaths = new Hashtable() {{"Deaths", 0}};
PhotonNetwork.player.SetCustomProperties(setPlayerDeaths);

//if WeaponSync master client, store reference tiem for others
if(PhotonNetwork.isMasterClient){
referenceTime = (float)PhotonNetwork.time;
//And store in room properties given reference time
Hashtable setReferenceTime = new Hashtable() {{"RefTime", referenceTime}};
PhotonNetwork.room.SetCustomProperties(setReferenceTime);

//Setup team scores
Hashtable setTeam1Score = new Hashtable() {{"Team1Score", 0}};
PhotonNetwork.room.SetCustomProperties(setTeam1Score);

Hashtable setTeam2Score = new Hashtable() {{"Team2Score", 0}};
PhotonNetwork.room.SetCustomProperties(setTeam2Score);
}else{
//Get saved reference time
referenceTime = (float)PhotonNetwork.room.customProperties["RefTime"];
}

//Join all spawn points in one list for DM mode
allSpawnPoints.Clear();
foreach(Transform point in team_1.spawnPoints){
allSpawnPoints.Add(point);
}
foreach(Transform point in team_2.spawnPoints){
allSpawnPoints.Add(point);
}
}

// Update is called once per frame
void Update () {
if(Input.GetKeyDown(KeyCode.Tab)){
isPaused = !isPaused;
}

if(Input.GetKeyDown(KeyCode.P)){
Screen.fullScreen = !Screen.fullScreen;
if(!Screen.fullScreen){
Screen.SetResolution(resolutions[resolutionIndex].width, resolutions[resolutionIndex].height, true);
}
}

if(isPaused){
if(enableHelper.activeSelf == true){
enableHelper.SetActive(false);
}
Screen.lockCursor = false;
}else{
if(enableHelper.activeSelf == false){
enableHelper.SetActive(true);
}
Screen.lockCursor = true;
}

if (Time.time - updateRate > nextUpdateTime){
nextUpdateTime = Time.time - Time.deltaTime;
}

//Send player ping every 5 seconds
while(nextUpdateTime < Time.time){
Hashtable setPlayerPing = new Hashtable() {{"Ping", PhotonNetwork.GetPing()}};
PhotonNetwork.player.SetCustomProperties(setPlayerPing);
nextUpdateTime += updateRate;
}
}

void FixedUpdate(){
if(isPaused || gameMode == "DM"){
allPlayers.Clear();
foreach(PhotonPlayer player in PhotonNetwork.playerList){
allPlayers.Add (player);
}

if(allPlayers != null){
allPlayers.Sort(SortPlayers);
leadingPlayer = allPlayers[0].name;
}
}

//Track round countdown timer
float tempRoundTime = roundDuration - ((float)PhotonNetwork.time - referenceTime);
if(tempRoundTime > 0){
currentRoundTime = tempRoundTime;
}else{
currentRoundTime = 0;
if(!roundEnded){
StartCoroutine(RoundEnded());
isPaused = false;
roundEnded = true;
}
}

//Get team scores
if(PhotonNetwork.room != null){
team1Score = (int)PhotonNetwork.room.customProperties["Team1Score"];
team2Score = (int)PhotonNetwork.room.customProperties["Team2Score"];
}
}

IEnumerator RoundEnded(){
gameMode = (string)PhotonNetwork.room.customProperties["GameMode"];
if(gameMode == "TDM"){
if(team1Score == team2Score){
finalText = "Draw... Restarting";
}
if(team1Score > team2Score){
finalText = team_1.teamName + " Won... Restarting";
}
if(team1Score < team2Score){
finalText = team_2.teamName + " Won... Restarting";
}
}else{
finalText = leadingPlayer + " is Winner... Restarting";
}
//Call this when round time is over and move players to lobby
yield return new WaitForSeconds(5);
StartCoroutine(Restart());
}

//Restart round **************************************************************************
IEnumerator Restart(){
//Reset player properties
Hashtable setPlayerKills = new Hashtable() {{"Kills", 0}};
PhotonNetwork.player.SetCustomProperties(setPlayerKills);

Hashtable setPlayerDeaths = new Hashtable() {{"Deaths", 0}};
PhotonNetwork.player.SetCustomProperties(setPlayerDeaths);

//if WeaponSync master client, store reference tiem for others
if(PhotonNetwork.isMasterClient){
referenceTime = (float)PhotonNetwork.time;
//And store in room properties given reference time
Hashtable setReferenceTime = new Hashtable() {{"RefTime", referenceTime}};
PhotonNetwork.room.SetCustomProperties(setReferenceTime);

//Reset team scores
Hashtable setTeam1Score = new Hashtable() {{"Team1Score", 0}};
PhotonNetwork.room.SetCustomProperties(setTeam1Score);

Hashtable setTeam2Score = new Hashtable() {{"Team2Score", 0}};
PhotonNetwork.room.SetCustomProperties(setTeam2Score);
}else{
//Get saved reference time
while(referenceTime == (float)PhotonNetwork.room.customProperties["RefTime"]){
yield return null;
}
referenceTime = (float)PhotonNetwork.room.customProperties["RefTime"];
}

if(Player){
PhotonNetwork.Destroy(Player);
}

yield return new WaitForSeconds(0.2f);

if((string)PhotonNetwork.player.customProperties["TeamName"] != "Spectators"){
SpawnPlayer((string)PhotonNetwork.player.customProperties["TeamName"]);
}
roundEnded = false;
}
//***********************************************************************************

void OnGUI(){
GUI.skin = guiSkin;
GUI.Label(new Rect(Screen.width-190, Screen.height-80, 190, 20), " Tab - pause menu");

GUI.color = new Color(1, 1, 1, 0.7f);
if(isPaused){
GUI.color = new Color(1, 1, 1, 0.7f);
GUI.Window (0, new Rect (Screen.width/2 - 250, Screen.height/2 - 210, 500, 500), MainMenu, "Room: " + PhotonNetwork.room.name + " | Game Mode: " + gameMode);
}

//Display round countdown timer
float roundedRestSeconds = Mathf.CeilToInt(currentRoundTime);
int displaySeconds = Mathf.FloorToInt(roundedRestSeconds % 60);
int displayMinutes = Mathf.FloorToInt((roundedRestSeconds / 60)%60);
string niceTime = string.Format("{0:00}:{1:00}", displayMinutes, displaySeconds);

GUI.Box(new Rect(Screen.width/2 - 50, 45, 100, 30), niceTime);

//Display Team Scores
if(gameMode == "TDM"){
GUILayout.BeginArea(new Rect(Screen.width/3 - 100, 45, 200, 30));
GUILayout.BeginHorizontal("box", GUILayout.Width(200), GUILayout.Height(30));
GUI.color = team_1_Color;
GUILayout.Label(team_1.teamName + ":");
GUILayout.Space(5);
GUI.color = Color.white;
GUILayout.Label(team1Score.ToString());
GUILayout.EndHorizontal();
GUILayout.EndArea();

GUILayout.BeginArea(new Rect(Screen.width - Screen.width/3 - 100, 45, 200, 30));
GUILayout.BeginHorizontal("box", GUILayout.Width(200), GUILayout.Height(30));
GUI.color = team_2_Color;
GUILayout.Label(team_2.teamName + ":");
GUILayout.Space(5);
GUI.color = Color.white;
GUILayout.Label(team2Score.ToString());
GUILayout.EndHorizontal();
GUILayout.EndArea();
}else{
GUI.color = Color.white;
GUI.Box(new Rect(Screen.width/2 - 150, 80, 300, 30), "Leading Player: " + leadingPlayer);
}

GUI.color = Color.white;

if(roundEnded){
GUI.Box(new Rect(Screen.width/2 - 200, Screen.height/2 - 100, 400, 30), finalText);
}

//Fade black screen when returning to Lobby
FadeScreen();
}

void MainMenu (int windowID) {
GUI.FocusWindow(windowID);
GUILayout.Space (10);

GUILayout.BeginHorizontal();
Resolutions();
QualityWindow();

GUI.color = Color.white;

GUILayout.Space (15);

GUILayout.BeginVertical();
//Select Team to Join
if(gameMode == "TDM"){
//Team 1
if((string)PhotonNetwork.player.customProperties["TeamName"] == team_1.teamName
|| (!Player && (string)PhotonNetwork.player.customProperties["TeamName"] != "Spectators" || roundEnded)){
GUI.enabled = false;
}else{
GUI.enabled = true;
}
if(GUILayout.Button(team_1.teamName)){
//Kill current player if exist
if(!Player){
SpawnPlayer(team_1.teamName);
}else{
SwapTeams(team_1.teamName);
}
isPaused = false;
//Player joined team, notify everyone
gameObject.SendMessage("PlayerJoinedTeam", team_1.teamName, SendMessageOptions.DontRequireReceiver);
}

//Team 2
if((string)PhotonNetwork.player.customProperties["TeamName"] == team_2.teamName
|| (!Player && (string)PhotonNetwork.player.customProperties["TeamName"] != "Spectators" || roundEnded)){
GUI.enabled = false;
}else{
GUI.enabled = true;
}
if(GUILayout.Button(team_2.teamName)){
//Kill current player if exist
if(!Player){
SpawnPlayer(team_2.teamName);
}else{
SwapTeams(team_2.teamName);
}
isPaused = false;
//Player joined team, notify everyone
gameObject.SendMessage("PlayerJoinedTeam", team_2.teamName, SendMessageOptions.DontRequireReceiver);
}
}else{
//Join game with Deathmatch mode
if(Player || (string)PhotonNetwork.player.customProperties["TeamName"] != "Spectators"){
GUI.enabled = false;
}else{
GUI.enabled = true;
}
if(GUILayout.Button("Join")){
//Kill current player if exist
if(!Player){
SpawnPlayer(team_1.teamName);
}else{
SwapTeams(team_1.teamName);
}
isPaused = false;
//Player joined team, notify everyone
gameObject.SendMessage("PlayerJoinedTeam", "battle", SendMessageOptions.DontRequireReceiver);
}
}

GUI.enabled = true;

if(Player){
if(GUILayout.Button("Resume")){
isPaused = false;
}
}

if(GUILayout.Button("Leave Room")){
LeaveRoom();
}
GUILayout.EndVertical();
GUILayout.EndHorizontal();

GUILayout.Space (10);
GUILayout.BeginHorizontal();
if(playerList){
GUI.color = new Color(0, 20, 0, 0.6f);
}else{
GUI.color = Color.white;
}
if(GUILayout.Button("Player List", GUILayout.Width(150), GUILayout.Height(25))){
playerList = true;
}
if(!playerList){
GUI.color = new Color(0, 20, 0, 0.6f);
}else{
GUI.color = Color.white;
}
if(GUILayout.Button("Controls", GUILayout.Width(150), GUILayout.Height(25))){
playerList = false;
}
GUILayout.EndHorizontal();

GUILayout.Space (5);
GUI.color = Color.white;
scroll3 = GUILayout.BeginScrollView(scroll3, GUILayout.Width(480), GUILayout.Height(300));
if(!playerList){
//Show controls
GUI.color = new Color(20, 20,0, 0.6f);
GUILayout.Label("Tab - Pause Menu");
GUILayout.Label("P - Fullscreen");
GUILayout.Label("T - Chat / Enter - send");
GUILayout.Label("C - crouch");
GUILayout.Label("Left Ctrl - prone");
GUILayout.Label("LMB - fire");
GUILayout.Label("RMB - aim");
GUILayout.Label("F - weapon pick up");
GUILayout.Label("R - reload");
GUILayout.Label("Left Shift - run");
GUILayout.Label("Space - jump");
GUILayout.Label("1/2 - weapon change");
GUILayout.Label("While selected STW-25 press G for flashlight");
}else{
//Show player list***
GUI.color = new Color(1,1,1,0.8f);

if(gameMode == "TDM"){
//Display Team 1 **************************************************************************
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUI.color = team_1_Color;
GUILayout.Label(team_1.teamName);
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();

foreach(PhotonPlayer player in allPlayers){
if((string)player.customProperties["TeamName"] == team_1.teamName){
if(PhotonNetwork.player.name == player.name){
GUI.color = Color.yellow;
}else{
GUI.color = Color.white;
}
GUILayout.BeginHorizontal("box");{
GUILayout.Label(player.name, GUILayout.Width(150));
GUILayout.Label("Kills: " + ((int)player.customProperties["Kills"]).ToString(), GUILayout.Width(115));
GUILayout.Label("Deaths: " + ((int)player.customProperties["Deaths"]).ToString(), GUILayout.Width(115));
GUILayout.FlexibleSpace();
if(player.customProperties["Ping"] != null){
GUILayout.Label("Ping: " + ((int)player.customProperties["Ping"]).ToString());
}
GUILayout.EndHorizontal();}
}
}
//*************************************************************************************

//Display Team 2 **************************************************************************
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUI.color = team_2_Color;
GUILayout.Label(team_2.teamName);
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();

foreach(PhotonPlayer player in allPlayers){
if((string)player.customProperties["TeamName"] == team_2.teamName){
if(PhotonNetwork.player.name == player.name){
GUI.color = Color.yellow;
}else{
GUI.color = Color.white;
}
GUILayout.BeginHorizontal("box");{
GUILayout.Label(player.name, GUILayout.Width(150));
GUILayout.Label("Kills: " + ((int)player.customProperties["Kills"]).ToString(), GUILayout.Width(115));
GUILayout.Label("Deaths: " + ((int)player.customProperties["Deaths"]).ToString(), GUILayout.Width(115));
GUILayout.FlexibleSpace();
if(player.customProperties["Ping"] != null){
GUILayout.Label("Ping: " + ((int)player.customProperties["Ping"]).ToString());
}
GUILayout.EndHorizontal();}
}
}
//*************************************************************************************
}else{
//If game mode is Deathmatch, display all players **************************************************
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUI.color = Color.green;
GUILayout.Label("All Players");
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();

foreach(PhotonPlayer player in allPlayers){
if((string)player.customProperties["TeamName"] != "Spectators"){
if(PhotonNetwork.player.name == player.name){
GUI.color = Color.yellow;
}else{
GUI.color = Color.white;
}
GUILayout.BeginHorizontal("box");{
GUILayout.Label(player.name, GUILayout.Width(150));
GUILayout.Label("Kills: " + ((int)player.customProperties["Kills"]).ToString(), GUILayout.Width(115));
GUILayout.Label("Deaths: " + ((int)player.customProperties["Deaths"]).ToString(), GUILayout.Width(115));
GUILayout.FlexibleSpace();
if(player.customProperties["Ping"] != null){
GUILayout.Label("Ping: " + ((int)player.customProperties["Ping"]).ToString());
}
GUILayout.EndHorizontal();}
}
}
}
//Display Spctators ****************************************************************************
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUI.color = Color.green;
GUILayout.Label("- Spectators -");
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();

foreach(PhotonPlayer player in allPlayers){
if((string)player.customProperties["TeamName"] == "Spectators"){
if(PhotonNetwork.player.name == player.name){
GUI.color = Color.yellow;
}else{
GUI.color = Color.white;
}
GUILayout.BeginHorizontal("box");{
GUILayout.Label(player.name);
GUILayout.FlexibleSpace();
if(player.customProperties["Ping"] != null){
GUILayout.Label("Ping: " + ((int)player.customProperties["Ping"]).ToString());
}
GUILayout.EndHorizontal();}
}
}
//*************************************************************************************
}
GUILayout.EndScrollView();
}

void Resolutions(){
GUILayout.BeginVertical();
GUILayout.Label("Resolution");
scroll = GUILayout.BeginScrollView(scroll, GUILayout.Width(140), GUILayout.Height(100));
GUILayout.BeginVertical();
for(int a = 0; a < resolutions.Length; a++){
if(resolutions[a].width == Screen.width && resolutions[a].height == Screen.height){
GUI.color = new Color(0, 20, 20, 0.6f);
}else{
GUI.color = new Color(20, 20, 20, 0.6f);
}
if(GUILayout.Button(resolutions[a].width + " x " + resolutions[a].height)){
resolutionIndex = a;
if(Screen.fullScreen){
Screen.SetResolution (resolutions[resolutionIndex].width,resolutions[resolutionIndex].height, true);
}
}
}
GUILayout.EndVertical();
GUILayout.EndScrollView();
GUILayout.EndVertical();
}

void QualityWindow(){
//GUILayout.Space (10);
GUILayout.BeginVertical();
GUI.color = Color.white;
GUILayout.Label("Quality");
scroll2 = GUILayout.BeginScrollView(scroll2, GUILayout.Width(140), GUILayout.Height(100));
GUILayout.BeginVertical();
for (var i = 0; i < QualityNames.Length; i++){
if(QualityNames[i] == QualityNames[QualitySettings.GetQualityLevel ()]){
GUI.color = new Color(0, 20, 20, 0.6f);
}else{
GUI.color = new Color(20, 20, 20, 0.6f);
}
if (GUILayout.Button (QualityNames[i]))
QualitySettings.SetQualityLevel (i, true);
}
GUILayout.EndVertical();
GUILayout.EndScrollView();
GUILayout.EndVertical();
}

void FadeScreen(){
if(fadeDir == 1){
fadeValue += fadeDir * 15 * Time.deltaTime;
fadeValue = Mathf.Clamp01(fadeValue);

GUI.color = new Color(1,1,1,fadeValue);
GUI.DrawTexture(new Rect(0,0, Screen.width, Screen.height), blackScreen);

GUI.color = Color.white;
GUI.Label(new Rect(Screen.width/2 - 75, Screen.height/2 - 15, 150, 30), "Loading...");
}
}

void SpawnPlayer(string teamName){
if(Player){
PhotonNetwork.Destroy(Player);
}
enableHelper.SetActive(true);
Hashtable setPlayerTeam = new Hashtable() {{"TeamName", teamName}};
PhotonNetwork.player.SetCustomProperties(setPlayerTeam);
//Spawn our player
int temp;
if(teamName == team_1.teamName){
if(gameMode == "TDM"){
temp = Random.Range(0, team_1.spawnPoints.Count);
Player = PhotonNetwork.Instantiate(playerPrefab.name, team_1.spawnPoints[temp].position, team_1.spawnPoints[temp].rotation, 0);
Player.name = PhotonNetwork.player.name;
}else{
//Spawn player in DM mode
temp = Random.Range(0, allSpawnPoints.Count);
Player = PhotonNetwork.Instantiate(playerPrefab.name, allSpawnPoints[temp].position, allSpawnPoints[temp].rotation, 0);
Player.name = PhotonNetwork.player.name;
}
}else{
temp = Random.Range(0, team_2.spawnPoints.Count);
Player = PhotonNetwork.Instantiate(playerPrefab.name, team_2.spawnPoints[temp].position, team_2.spawnPoints[temp].rotation, 0);
Player.name = PhotonNetwork.player.name;
}
roomCamera.SetActive(false);
}

void SwapTeams(string teamName){
Hashtable setPlayerTeam = new Hashtable() {{"TeamName", teamName}};
PhotonNetwork.player.SetCustomProperties(setPlayerTeam);
Player.SendMessage("SwapTeams");
}

void LeaveRoom(){
if(PhotonNetwork.connected){
PhotonNetwork.LeaveRoom();
}
}

IEnumerator LoadMap(string sceneName){
PhotonNetwork.isMessageQueueRunning = false;
fadeDir = 1;
yield return new WaitForSeconds(1);

Application.backgroundLoadingPriority = ThreadPriority.High;
AsyncOperation async = Application.LoadLevelAsync(sceneName);
yield return async;
Debug.Log("Loading complete");
}

void OnDisconnectedFromPhoton(){
print ("Disconnected from Photon");
//Something wrong with connection - go to main menu
isPaused = false;
roomCamera.SetActive(true);
StartCoroutine(LoadMap("MainMenu"));
}

void OnLeftRoom(){
isPaused = false;
roomCamera.SetActive(true);
StartCoroutine(LoadMap("MainMenu"));
}
}




Сообщение отредактировал Alisher987 - Среда, 31 Июля 2013, 17:33
Alisher987Дата: Среда, 31 Июля 2013, 00:11 | Сообщение # 5 | Тема: Работы в 3D
участник
Сейчас нет на сайте
Yani-X, eek

Alisher987Дата: Понедельник, 29 Июля 2013, 10:25 | Сообщение # 6 | Тема: Нужно скопипастить текст
участник
Сейчас нет на сайте
Создание текстуры в sci-fi стиле

Здравствуйте. В этом уроке я расскажу как можно быстро нарисовать текстуру в sci-fi стиле.

В интернете подобных уроков достаточно много, особенно на англоязычных ресурсах. Я лишь постараюсь обобщить все те уроки, которые читал сам. Текстуру будем рисовать в фотошопе.
Для начала, нам нужно создать несколько собственных кистей. Это весьма важный момент, который придает нашему рабочему процессу максимальную гибкость. Мы можем, конечно, скачать с сети гигабайты кистей всевозможных форм и фактур, но это не самый продуктивный способ, хотя и отказываться от него в конечном счете, конечно же, тоже не стоит. Итак, создайте новое изображение размером 1024х1024 пикселя. После чего нам нужно найти подходящую фототекстуру грязи. На сайте cg-textures.com их полно. Ищите контрастную текстуру, поскольку нам понадобится выдергивать пятна из этой текстуры. Я взял вот эту.

Перетащите текстуру в рабочее окно фотошопа, после чего настройте масштаб текстуры таким образом, чтобы она заполнила все пространство холста. Произведите растеризацию импортированного изображения (пкм по слою > rasterize layer). Откройте вкладку Select и выберите инструмент выделения Color Range.

Откроется окно с настройками инструмента, но пока ничего не настраиваем в нем, а выбираем пипеткой цвет на текстуре (лкм по нужному участку текстуры). После того, как цвет выбран, его область будет показана белым цветом в окне Color Range. Теперь мы можем настроить некоторые параметры. В принципе, нам нужен только один параметр — Fuzziness, который определяет силу выделения. Настройте по желанию этот параметр и жмите OK. Теперь наша текстура покрыта кашей из выделения, разобрать которое не представляется возможным, но нам это и не нужно. Если вы выделяли цвет, который нам нужно изолировать, то инвертируйте выделение (Shift+Ctrl+I) и нажмите Delete. Теперь переходите во вкладку Edit, в которой выберите инструмент Define Brush Preset.

Дайте новой кисти название и жмите OK. Нажмите Ctrl+D, чтобы снять выделение. Теперь в браузере кистей у нас появилась новая кисть, которую мы только что сделали. Чтобы ею воспользоваться, выберите инструмент Brush (или просто нажмите cool и над холстом кликните пкм. Откроется браузер кистей, наша будет в самом низу. Можете выбрать её и покалякать что-нибудь. smile Удалите слой с текстурой, он нам больше не нужен. Осталось лишь сохранить кисть, но сохранить можно только набор кистей, поэтому я бы рекомендовал удалить все ненужные кисти в браузере кистей (пкм по кисти > Delete Brush), оставив лишь новую кисть. Затем откройте список редактирования в окне браузера кистей и выберите Save Brushes.

Дайте файлу понятное название и сохраняйте. Первое и важное дело сделано! Конечно, сохранять лишь одну кисть — не совсем рационально, поэтому лучше делать набор кистей, или сохранять кисть определенного стиля в конкретный набор. Поняв этот несложный принцип создания кистей, вы получаете огромный простор для создания будущих уникальных текстур!
Приступаем непосредственно с созданию sci-fi текстуры. Создайте новый документ, пусть его размер будет 512х512 пикселей. Залейте первый слой серым цветом. Теперь мы будем рисовать фигуры, - основу нашего будущего шедевра. Выберите инструмент Polygonal Lasso (можно нажать клавишу L, для быстрого доступа). Вам нужно создать выделение нужной формы. Возьмите на заметку, что если форма вашего объекта будет симметрична с двух сторон, то достаточно нарисовать половинку формы и клонировать её по 2 осям, если форма будет симметрична с четырех сторон, то рисуем только четвертинку. В моем случае, это четвертинка. Создайте новый слой и приступайте к выстраиванию выделения инструментом Lasso. Для того, чтобы рисовать ровно по горизонтали, вертикали и горизонтали, зажимайте Shift. После того, как форма образуется, залейте выделенную область более светлой чем фон тоном с помощью инструмента Paint Bucket (в простонародье заливка).

Снимите выделение. Далее, нам нужно клонировать элемент формы. Убедитесь, что выделен слой с формой, зажмите Shift+Ctrl+Alt и перетаскивайте клон элемента вправо, зажав лкм. Мы создали новый слой с клонированным элементом, который нам нужно отзеркалить горизонтально. Для этого нажмите Ctrl+T, эта операция переключит наш объект в режим свободной трансформации. Нажмите пкм и в появившемся списке выберите Flip Horizontal, затем Enter. В итоге мы получили вот такой результат.

Отрегулировав позицию правого элемента формы (зажимаем Ctrl+Shift и перетаскиваем объект с помощью лкм), можно объединить слои наших формочек, нажав Ctrl+E). Теперь это один цельный объект. Проделываем данную операцию еще раз для создания вертикальной копии формы. Первая форма собрана.

Теперь мы поняли принцип создания формы и можем на основе полученных знаний наклепать еще несколько формочек. С помощью инструментов прямоугольного и эллиптического выделения можно вырезать на формочках весьма интересные фигуры. Если вам и этого недостаточно, то можно прибегнуть к помощи инструмента Vector Shapes, с помощью которого можно создавать сложные векторные фигурки, снимать с них выделение (Ctrl+лкм по слою с векторной фигуркой) и вырезать полученные формы из основного объекта. Как вы поняли, принцип булевых операций (так нелюбимых в пакетах трехмерной графики smile ) здесь просто незаменим! Вот такая форма путем нехитрых операций получилась у меня.

Придадим объем нашей форме. Для этого 2 раза кликните по слою формочки. Откроется окно с инструментами стиля слоя, иначе говоря эффектами. Нам пока нужен только Bevel and Emboss эффект. Настройки следующие (то что нужно настраивать обведено красной рамкой):

Благодаря таким настройкам мы получаем жесткое выдавливание.

Теперь можно приступать к пачканию (раскрашиванию) полученной формы. Задайте основной тон дальнему и ближнему элементам, создайте новый слой и примените к слою эффект overlay. Выбираем инструмент Brush, и в браузере кистей выбираем кисть, которую мы создали недавно. Можно начинать красить. smile Размер кисти желательно задать во весь размер холста и наносить цвет не мазками, а точками, то есть кликать по холсту лкм по разным участкам холста. Ластику желательно тоже задать нашу кисть, чтобы стирание неудачных участков выглядело естественным. Создавайте новые слои для разных цветов грязи. В моем случае, я использовал 3 слоя с грязью. Получилось вот так.



Выглядит пока что не очень живенько. Поэтому, вышеописанным способом я добавил еще несколько элементов.

При желании можно добавить светящихся элементов. Для этого выделяем с помощью Magic Wand (выбирается также клавишей W) нужные участки. Не забудьте переключить режим выделения на Add to selection, чтобы к выделению добавлялось новое выделение, а не убирало его.

Создаем новый слой и заливаем выделенную область бирюзовым цветом. Затем заходим в окно настройки стиля слоя и включаем эффект Outer Glow, немножко под-настроив его.

Получился вот такой результат.

Кому-то текстура может показаться законченной, но это не так. smile Сейчас она выглядит слишком искусственной, и с этим нужно бороться. Сохраняйте картинку в хорошем качестве (можно в png, к примеру). Можно закрыть наш документ со слоями, не забыв сохранить в исходном расширении (psd). Открываем файл с текстурой. Для начала нам нужно немного подрегулировать уровни. Немного повышаем светлые тона, и чуть затемняем средние.

Далее, немного повышаем насыщенность цвета.

Теперь предстоит немного ручной работы (это шутка юмора, на самом деле вам предстоит очень долгая и кропотливая работа :)). Выбираем инструмент Dodge (клавиша O), затем выбираем кисточку по-жестче (можно простую круглую кисть с жесткими краями) и аккуратно и со вкусом высветляем и затемняем те грани, на которые падает свет. Таким же образом наносятся царапины. Настраиваем кисточке размер в 1 пиксель, проводим резкий мазок с помощью Burn Tool, затем на пиксель дальше делаем мазок инструментом Dodge Tool.

Почему мы используем инструменты Burn и Dodge Tool, а не Brush Tool? Все просто. Эти инструменты высветляют и затемняют уже имеющиеся пиксели изображения, учитывая цвет и яркость. Поэтому используйте их для подобных задач и не морочьте себе голову. smile Помулевав как следует, в итоге мы добиваемся такого результата.

Можете скачать исходный файл (psd) этой текстуры.
На этом все! Надеюсь, этот небольшой урок вдохновит вас на создание своих научно-фантастических текстур! smile
С уважением, Yani-X.


Alisher987Дата: Воскресенье, 28 Июля 2013, 22:01 | Сообщение # 7 | Тема: Как заработать в интернете?
участник
Сейчас нет на сайте
socialtools.ru ставишь лайки,подписываешь в группах на каналах ютюб и все плата за 1 заказ минимум 2,32 руб

Alisher987Дата: Воскресенье, 28 Июля 2013, 19:56 | Сообщение # 8 | Тема: Создаю дизайны для лаунчеров Minecraft серверов
участник
Сейчас нет на сайте
о боже я конечно понимаю что ты ценишь свой труд но это ужасно все эти эффекты накладываются очень просто

Alisher987Дата: Пятница, 26 Июля 2013, 23:42 | Сообщение # 9 | Тема: Хостинг игровых и голосовых серверов от GameNest.ru
участник
Сейчас нет на сайте
сегодня с друзьями нашли ваш тестовый сервер спасибо вам за пустой сервер! biggrin

Alisher987Дата: Пятница, 26 Июля 2013, 23:38 | Сообщение # 10 | Тема: Falco Software: купим игры на Юнити
участник
Сейчас нет на сайте
falcoware, молодцы cool

Alisher987Дата: Пятница, 26 Июля 2013, 14:28 | Сообщение # 11 | Тема: [OnlineFPS]SpaceBoll[3D]
участник
Сейчас нет на сайте
zisX, сделай для оружие отдельный рендер у Alcatraz есть урок кажется cool

Alisher987Дата: Пятница, 26 Июля 2013, 10:59 | Сообщение # 12 | Тема: Мультиплеерный хоррор [3D]
участник
Сейчас нет на сайте
Цитата (White9)

Спасибо КЭП! Вообще-то Survivors Viy - и есть полное название той игры

Какие есть похожие игры: Survivors Viy


Alisher987Дата: Пятница, 26 Июля 2013, 10:47 | Сообщение # 13 | Тема: Falco Software: купим игры на Юнити
участник
Сейчас нет на сайте
ахахаха лазил на стиме увидел это http://steamcommunity.com/id/falcoware/myworkshopfiles/?section=greenlight

Alisher987Дата: Пятница, 26 Июля 2013, 09:33 | Сообщение # 14 | Тема: [3D] - Defolmia - [FPS]
участник
Сейчас нет на сайте
dusha_kala, Предвижу БАН!

Alisher987Дата: Четверг, 25 Июля 2013, 14:42 | Сообщение # 15 | Тема: Каков ваш род деятельности в игрострое?
участник
Сейчас нет на сайте
Сценарист
Геймдизайнер
Программист
Звукорежиссер
Художник
Создатель уровней
Продюсер
Менеджер
Руководитель проекта


Alisher987Дата: Четверг, 25 Июля 2013, 08:50 | Сообщение # 16 | Тема: Реально ли создать игру и разбогатеть?
участник
Сейчас нет на сайте
AlexRabbit,
Цитата
Лохоразводильные сервисы для фанов Киосаки идут лесом.
ты хотя-бы знаешь кто он такой?


Alisher987Дата: Среда, 24 Июля 2013, 23:41 | Сообщение # 17 | Тема: GCUP Redesign
участник
Сейчас нет на сайте
апиз*даху*нчик

Alisher987Дата: Среда, 24 Июля 2013, 10:36 | Сообщение # 18 | Тема: [3D]Прятки [Survival]
участник
Сейчас нет на сайте
Gammeza, почти

Alisher987Дата: Среда, 24 Июля 2013, 09:54 | Сообщение # 19 | Тема: [3D]Прятки [Survival]
участник
Сейчас нет на сайте
наверное сеть сделаю фотоновскую
Turugnite, нет незнаю погуглил ничего путвёвого не вышло

Добавлено (24.07.2013, 09:54)
---------------------------------------------
Уже прикинул несколько идей для реализации скорее всего будет 1 убийца и все остальные жертвы ,жертвы прячутся а убийца убивает будет много лазеек ,и немножко тумана чтобы не было видно далеко


Alisher987Дата: Вторник, 23 Июля 2013, 12:47 | Сообщение # 20 | Тема: [3D]Прятки [Survival]
участник
Сейчас нет на сайте
Описание темы:Решил начать делать игру Прятки это теже самые прятки только перенесенные в компьютерною игру ,в игре будет присутствовать только Мультиплеерный режим
Жанр: Прятки
Пространство: 3d
Вид:от первого лица
Описание (Сюжет): Надо найти другого игрока.
Особенности вашей игры: - Еще не было такой игры в моей памяти
Кто требуется в команду: - со временем будет ясно кто нужен
Какие есть похожие игры? Нету
Для какой платформы? PC,Mac,Linux
Какой движок\конструктор собираетесь использовать? Unity 3d
Чему вы собираетесь уделить больше внимания? Всему




Сообщение отредактировал Alisher987 - Вторник, 23 Июля 2013, 12:47
Форум игроделов » Записи участника » Alisher987 [270]
  • Страница 1 из 14
  • 1
  • 2
  • 3
  • 13
  • 14
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2019 Рейтинг