forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Очень нужна ваша помощь (http://forum.boolean.name/showthread.php?t=17939)

Федор 26.02.2013 18:22

Очень нужна ваша помощь
 
Здравствуйте. Решил сделать маленькую игру и столкнулся с проблемой. Есть предмет который должен автоматически двигаться вниз, а когда нажата кнопка вверх (UpArrow) предмет должен подниматься.

Код:

public class Pl : MonoBehaviour {
       

        public float speed;
        private bool up;

       
        void Start () {
       
                up = false;
                speed = 1;

        }
       

        void Update ()
        {
        if (Time.timeScale != 0)
                {
                        if(Input.GetKeyDown(KeyCode.UpArrow))
                        {
                                SetUp(false);
                        }
                        else if(Input.GetKeyUp(KeyCode.UpArrow))
                        {
                                SetUp(false);
                        }

                        if(!up)
                        {
                                Down();
                        }
                        else
                        {
                                Up();
                        }
                }
        }
        void Up()
        {
                Vector3 temp = transform.position;
                temp.y = 4;
                transform.position = temp;
        }
        void Down()
        {
                Vector3 temp = transform.position;
                temp.y = -4;
                transform.position = temp;
               
        }
        void SetUp(bool up)
        {
                this.up = up;
        }
}

Он сразу летит в указанную координату "4", а должен плавно перемещаться. Помогите разобраться.

EvilOkta 26.02.2013 18:39

Ответ: Очень нужна ваша помощь
 
Первое что бросается в глаза ошибка в условии:

PHP код:

if (Time.timeScale != 0)
        {
            if(
Input.GetKeyDown(KeyCode.UpArrow))
            {
                
SetUp(false);
            }
            else if(
Input.GetKeyUp(KeyCode.UpArrow))
            {
                
SetUp(false);
            } 

условие дублируется дважды, я так думаю во втором случае имелось ввиду KeyCode.DownArrow? тогда нужно в метод передать true и в методе менять ее на false

PHP код:

void Up()
    {
        
Vector3 temp transform.position;
        
temp.4;
        
transform.position temp

Такая конструкция сразу перенесет объект в позицию с координатой Y = 4.
Для плавного перемещения используйте Translate:

PHP код:

transform.Translate(Vector3.up Time.deltaTimeSpace.World); // как пример из справки 

Вот подробнее
http://docs.unity3d.com/Documentatio...Translate.html

И затем проверяйте условием достиг ли объект y=4. Если достиг то обнуляйте переменную up.

З.Ы. Писал без юнити под боком, но надеюсь идея понятна

EvilOkta 26.02.2013 18:47

Ответ: Очень нужна ваша помощь
 
еще обратил внимание - в обоих условиях нужно использовать GetKeyDown - это событие в момент нажатия кнопки, GetKeyUp наступает
когда клавиша наоборот отжимается.

upd:
невнимательно прочел условие задачи. действительно в вашем случае нужно использовать GetKeyUp и GetKeyDown, но тогда при событии GetKeyDown нужно обнулять значение up

и неправильно понял про GetKeyUp(KeyCode.UpArrow) - здесь у вас все правильно. =) Конец рабочего дня, совсем не вижу мелочей))

Федор 26.02.2013 18:49

Ответ: Очень нужна ваша помощь
 
Спасибо большое за помощь. Сейчас буду исправлять свои грехи.

EvilOkta 26.02.2013 19:00

Ответ: Очень нужна ваша помощь
 
вот тут непонятно еще:
this.up = up;

имелось ввиду наверное
this.up = true;
или
this.up = false;

Федор 26.02.2013 19:10

Ответ: Очень нужна ваша помощь
 
Честно говоря я не знаю, я только начал изучать юнити и писал код как знал. Просто нигде не нашел примера :(

P.S. Исправил как Вы посоветовали, но без изменений...

P.S.s. Не могли бы Вы помочь мне с написанием кода?

pax 26.02.2013 19:47

Ответ: Очень нужна ваша помощь
 
Имхо много лишнего по указанной постановке задачи...

PHP код:

public class Pl MonoBehaviour {

     public 
float speed;

    
void Start () 
        {
             
speed 1;
        }
    

    
void Update () 
    {
             
Vector3 temp transform.position;
             if(
Input.GetKey(KeyCode.UpArrow))
             {
                  
temp.+= Time.deltaTime speed;
             }
             else
             {
                  
temp.-= Time.deltaTime speed;
             }
             
temp.Mathf.Clamp(temp.y, -4f4f);
             
transform.position temp;
    }



LLI.T.A.L.K.E.R. 19.06.2014 05:17

Ответ: Очень нужна ваша помощь
 
как перехватить handle у респавненого объекта (игрока)?

как прикрепить камеру к программно созданному объекту?

если держать скрипт в префабе объекта - хер камеру свяжешь
если делать скрипт в камере - не знаю как прикрепить респавн

ну и мудёж..


что куда тыкать-втыкать?

перечитал 10 ресурсов и везде тычат на скрипт висящий на камере, к которому крепится подготовленный player..

будто никогда никто не крепил камеру к prefab-у.. или это секретный код?

LLI.T.A.L.K.E.R. 19.06.2014 05:24

Ответ: Очень нужна ваша помощь
 
в общем проще ответить как прикреплять к скрипту респавнутый объект

вот коды чего сейчас изучаю:
PHP код:

using UnityEngine;
using System.Collections;

public class 
NetworkManager MonoBehaviour {

public 
GameObject playerPrefab;

private const 
string typeName "UniqueGameName";
private const 
string gameName "RoomName";

private 
void StartServer()
{
    
Network.InitializeServer(425000, !Network.HavePublicAddress());
    
MasterServer.RegisterHost(typeNamegameName);
}

private 
HostData[] hostList;

private 
void RefreshHostList()
{
    
MasterServer.RequestHostList(typeName);
}

void OnMasterServerEvent(MasterServerEvent msEvent)
{
    if (
msEvent == MasterServerEvent.HostListReceived)
        
hostList MasterServer.PollHostList();
}

private 
void JoinServer(HostData hostData)
{
    
Network.Connect(hostData);
}

void OnGUI()
{
    if (!
Network.isClient && !Network.isServer)
    {
        if (
GUI.Button(new Rect(100100250100), "Start Server"))
            
StartServer();

        if (
GUI.Button(new Rect(100250250100), "Refresh Hosts"))
            
RefreshHostList();

        if (
hostList != null)
        {
            for (
int i 0hostList.Lengthi++)
            {
                if (
GUI.Button(new Rect(400100 + (110 i), 300100), hostList[i].gameName))
                    
JoinServer(hostList[i]);
            }
        }
    }
}

void OnServerInitialized()
{
    
SpawnPlayer();
}

void OnConnectedToServer()
{
    
SpawnPlayer();
}

private 
void SpawnPlayer()
{
    
Network.Instantiate(playerPrefab, new Vector3(0f5f0f), Quaternion.identity0);
}



PHP код:

using UnityEngine;
using System.Collections;

public class 
Player MonoBehaviour
{

public 
float speed 10f;

void Start() {
    if (!
networkView.isMinenetworkView.observed=this;
}

void InputMovement()
{
    if (
Input.GetKey(KeyCode.W))
        
rigidbody.MovePosition(rigidbody.position Vector3.forward speed Time.deltaTime);
    
    if (
Input.GetKey(KeyCode.S))
        
rigidbody.MovePosition(rigidbody.position Vector3.forward speed Time.deltaTime);
    
    if (
Input.GetKey(KeyCode.D))
        
rigidbody.MovePosition(rigidbody.position Vector3.right speed Time.deltaTime);
    
    if (
Input.GetKey(KeyCode.A))
        
rigidbody.MovePosition(rigidbody.position Vector3.right speed Time.deltaTime);
}

private 
float lastSynchronizationTime 0f;
private 
float syncDelay 0f;
private 
float syncTime 0f;
private 
Vector3 syncStartPosition Vector3.zero;
private 
Vector3 syncEndPosition Vector3.zero;

void OnSerializeNetworkView(BitStream streamNetworkMessageInfo info)
{
    
Vector3 syncPosition Vector3.zero;
    
Vector3 syncVelocity Vector3.zero;
    if (
stream.isWriting)
    {
        
syncPosition rigidbody.position;
        
stream.Serialize(ref syncPosition);
        
        
syncVelocity rigidbody.velocity;
        
stream.Serialize(ref syncVelocity);
    }
    else
    {
        
stream.Serialize(ref syncPosition);
        
stream.Serialize(ref syncVelocity);
        
        
syncTime 0f;
        
syncDelay Time.time lastSynchronizationTime;
        
lastSynchronizationTime Time.time;
        
        
syncEndPosition syncPosition syncVelocity syncDelay;
        
syncStartPosition rigidbody.position;
    }
}

void Update()
{
    if (
networkView.isMine)
    {
        
InputMovement();
    }
    else
    {
        
SyncedMovement();
    }
}

private 
void SyncedMovement()
{
    
syncTime += Time.deltaTime;
    
rigidbody.position Vector3.Lerp(syncStartPositionsyncEndPositionsyncTime syncDelay);
}





или надо б\у камеру удалять, а у спавн-объекта пересоздавать и закреплять?

LLI.T.A.L.K.E.R. 19.06.2014 06:27

Ответ: Очень нужна ваша помощь
 
пока из двух скриптов собрал этакое:

Цитата:

GameObject clone;
clone=Network.Instantiate(playerPrefab, new Vector3(0f, 5f, 0f), Quaternion.identity, 0) as GameObject;
transform.parent = clone.transform;

pax 19.06.2014 10:49

Ответ: Очень нужна ваша помощь
 
Собственно из кода ты можешь обращаться к камере так:
PHP код:

Camera.main.transform.parent = clone.transform

Статическое свойства Camera.main ищет первую попавшуюся камеру в сцене с тегом MainCamera. Поэтому где висит скрипт сети не важно.

Другой вариант, когда ты в скрипте создаешь ссылку на объект сцены.
PHP код:

public calss MyScriptMonoBehaviour{
    public 
Transform cameraTransform;

   


У такого скрипта появится свойство в инспекторе с названием Camera Transform на которое можно перетащить камеру из сцены. Потом в скрипте можно использовать поле cameraTransform как готовую ссылку на трансформ камеры.

PHP код:

cameraTransform.parent = clone.transform


LLI.T.A.L.K.E.R. 21.06.2014 03:55

Ответ: Очень нужна ваша помощь
 
для быстрого ответа читать итоговые вопросы ниже

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Как добавить скрипт (что-то) в prefab?

Хотел добавить доп. скрипт - а мне пишет:
cleaning up leaked objects

Что, заново новый prefab пересобирать?

(даже уже ранее применимый в этом же prefabe скрипт перекрепляю - нет, уже не принимает)
сложно с логикой в unity...


не воспринимает даже старых знакомых

первый скрипт родной для prefab

второй использовал для наглядности этот же (с другим скриптом так же), просто у этого точно ошибок нет (а раз другой не воспринимает, то и заниматься им некогда)
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

1 как редактировать prefab? как в готовый pref далее добавить такие плюшки как аудио, скрипт и прочие компоненты?

2 вопрос:
хочу переместить расположение скрипта (отсортировать по папкам)
- что делать дальше? почему unity теряет связь? хоть и пробовал пересвязать скрипты в объекте.
Ну например перекину в Scripts/ , а не хочу иметь Standard Assets/Character Controllers/Sources/Scripts/FPSInputController.js

ну вот............... хотел скрипт "стрельбу" к игроку прикрутить........ а тут на те - сперва prefab добейся...........

LLI.T.A.L.K.E.R. 21.06.2014 04:28

Ответ: Очень нужна ваша помощь
 
вопрос выше актуален

а пока сделал так
в Project сделал Create > Prefab

перетаскиванием мыши заменил старым в новый, переименовал в старое Player имя
и тут уже Unity разрешает делать (вроде) что хочешь

(а может всё из-за того что Player prefab был закреплён в скрипте у Camera)

а когда проект будет огромен и замудрен - как им управляются разработчики?
каждый раз детали заново откреплять-закреплять, пересоздавать?

pax 21.06.2014 09:37

Ответ: Очень нужна ваша помощь
 
Цитата:

cleaning up leaked objects
А какие-то пакаджи в проект ты импортировал? Я уверен что при работе с префабами не будет такой ошибки. Обычно некоторые плагины забывают в своих Editor-скриптах чистить ресурсы.

1. Перетаскиваешь префаб в сцену, изменяешь и жмеш кнопку Apply. Удаляешь из сцены. Если он уже в сцене есть и помечен синим, то просто изменяешь и жмешь Apply.

2. Перемещай скрипты и другие ассеты в окне Project, а не в проводнике или другой программе. Если перемещаешь в проводнике, то не забывай перемещать файлы *.meta вместе с файлами скриптов и папками. Если их нет, то надо в проекте их включить. Включается это в меню Edit > Project Settings > Editor > Version Control = Asset Server или Visible Meta Files

LLI.T.A.L.K.E.R. 21.06.2014 19:25

Ответ: Очень нужна ваша помощь
 
Цитата:

Сообщение от pax (Сообщение 283228)
2. Перемещай скрипты и другие ассеты в окне Project, а не в проводнике или другой программе.

в том то и дело что я поступал unity-логично и перемещал в панели project, но всё равно какая-то ошибка была.. ну пока это не так важно.

начал осваивать [RPC]


Часовой пояс GMT +4, время: 06:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot