|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
26.02.2013, 18:22
|
#1
|
AnyKey`щик
Регистрация: 26.02.2013
Сообщений: 3
Написано 0 полезных сообщений (для 0 пользователей)
|
Очень нужна ваша помощь
Здравствуйте. Решил сделать маленькую игру и столкнулся с проблемой. Есть предмет который должен автоматически двигаться вниз, а когда нажата кнопка вверх (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", а должен плавно перемещаться. Помогите разобраться.
|
(Offline)
|
|
26.02.2013, 18:39
|
#2
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Очень нужна ваша помощь
Первое что бросается в глаза ошибка в условии:
if (Time.timeScale != 0) { if(Input.GetKeyDown(KeyCode.UpArrow)) { SetUp(false); } else if(Input.GetKeyUp(KeyCode.UpArrow)) { SetUp(false); }
условие дублируется дважды, я так думаю во втором случае имелось ввиду KeyCode.DownArrow? тогда нужно в метод передать true и в методе менять ее на false
void Up() { Vector3 temp = transform.position; temp.y = 4; transform.position = temp;
Такая конструкция сразу перенесет объект в позицию с координатой Y = 4.
Для плавного перемещения используйте Translate:
transform.Translate(Vector3.up * Time.deltaTime, Space.World); // как пример из справки
Вот подробнее
http://docs.unity3d.com/Documentatio...Translate.html
И затем проверяйте условием достиг ли объект y=4. Если достиг то обнуляйте переменную up.
З.Ы. Писал без юнити под боком, но надеюсь идея понятна
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.02.2013, 18:47
|
#3
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Очень нужна ваша помощь
еще обратил внимание - в обоих условиях нужно использовать GetKeyDown - это событие в момент нажатия кнопки, GetKeyUp наступает
когда клавиша наоборот отжимается.
upd:
невнимательно прочел условие задачи. действительно в вашем случае нужно использовать GetKeyUp и GetKeyDown, но тогда при событии GetKeyDown нужно обнулять значение up
и неправильно понял про GetKeyUp(KeyCode.UpArrow) - здесь у вас все правильно. =) Конец рабочего дня, совсем не вижу мелочей))
|
(Offline)
|
|
26.02.2013, 18:49
|
#4
|
AnyKey`щик
Регистрация: 26.02.2013
Сообщений: 3
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Очень нужна ваша помощь
Спасибо большое за помощь. Сейчас буду исправлять свои грехи.
|
(Offline)
|
|
26.02.2013, 19:00
|
#5
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Очень нужна ваша помощь
вот тут непонятно еще:
this.up = up;
имелось ввиду наверное
this.up = true;
или
this.up = false;
|
(Offline)
|
|
26.02.2013, 19:10
|
#6
|
AnyKey`щик
Регистрация: 26.02.2013
Сообщений: 3
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Очень нужна ваша помощь
Честно говоря я не знаю, я только начал изучать юнити и писал код как знал. Просто нигде не нашел примера
P.S. Исправил как Вы посоветовали, но без изменений...
P.S.s. Не могли бы Вы помочь мне с написанием кода?
|
(Offline)
|
|
26.02.2013, 19:47
|
#7
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Очень нужна ваша помощь
Имхо много лишнего по указанной постановке задачи...
public class Pl : MonoBehaviour {
public float speed;
void Start () { speed = 1; }
void Update () { Vector3 temp = transform.position; if(Input.GetKey(KeyCode.UpArrow)) { temp.y += Time.deltaTime * speed; } else { temp.y -= Time.deltaTime * speed; } temp.y = Mathf.Clamp(temp.y, -4f, 4f); transform.position = temp; } }
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.06.2014, 05:17
|
#8
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Очень нужна ваша помощь
как перехватить handle у респавненого объекта (игрока)?
как прикрепить камеру к программно созданному объекту?
если держать скрипт в префабе объекта - хер камеру свяжешь
если делать скрипт в камере - не знаю как прикрепить респавн
ну и мудёж..
что куда тыкать-втыкать?
перечитал 10 ресурсов и везде тычат на скрипт висящий на камере, к которому крепится подготовленный player..
будто никогда никто не крепил камеру к prefab-у.. или это секретный код?
|
(Offline)
|
|
19.06.2014, 05:24
|
#9
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Очень нужна ваша помощь
в общем проще ответить как прикреплять к скрипту респавнутый объект
вот коды чего сейчас изучаю:
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(4, 25000, !Network.HavePublicAddress()); MasterServer.RegisterHost(typeName, gameName); }
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(100, 100, 250, 100), "Start Server")) StartServer();
if (GUI.Button(new Rect(100, 250, 250, 100), "Refresh Hosts")) RefreshHostList();
if (hostList != null) { for (int i = 0; i < hostList.Length; i++) { if (GUI.Button(new Rect(400, 100 + (110 * i), 300, 100), hostList[i].gameName)) JoinServer(hostList[i]); } } } }
void OnServerInitialized() { SpawnPlayer(); }
void OnConnectedToServer() { SpawnPlayer(); }
private void SpawnPlayer() { Network.Instantiate(playerPrefab, new Vector3(0f, 5f, 0f), Quaternion.identity, 0); }
}
using UnityEngine; using System.Collections;
public class Player : MonoBehaviour {
public float speed = 10f;
void Start() { if (!networkView.isMine) networkView.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 stream, NetworkMessageInfo 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(syncStartPosition, syncEndPosition, syncTime / syncDelay); }
}
или надо б\у камеру удалять, а у спавн-объекта пересоздавать и закреплять?
|
(Offline)
|
|
19.06.2014, 06:27
|
#10
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Очень нужна ваша помощь
пока из двух скриптов собрал этакое:
GameObject clone;
clone=Network.Instantiate(playerPrefab, new Vector3(0f, 5f, 0f), Quaternion.identity, 0) as GameObject;
transform.parent = clone.transform;
|
|
(Offline)
|
|
19.06.2014, 10:49
|
#11
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Очень нужна ваша помощь
Собственно из кода ты можешь обращаться к камере так:
Camera.main.transform.parent = clone.transform;
Статическое свойства Camera.main ищет первую попавшуюся камеру в сцене с тегом MainCamera. Поэтому где висит скрипт сети не важно.
Другой вариант, когда ты в скрипте создаешь ссылку на объект сцены.
public calss MyScript: MonoBehaviour{ public Transform cameraTransform;
}
У такого скрипта появится свойство в инспекторе с названием Camera Transform на которое можно перетащить камеру из сцены. Потом в скрипте можно использовать поле cameraTransform как готовую ссылку на трансформ камеры.
cameraTransform.parent = clone.transform;
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.06.2014, 03:55
|
#12
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Очень нужна ваша помощь
для быстрого ответа читать итоговые вопросы ниже
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Как добавить скрипт (что-то) в prefab?
Хотел добавить доп. скрипт - а мне пишет:
cleaning up leaked objects
Что, заново новый prefab пересобирать?
(даже уже ранее применимый в этом же prefabe скрипт перекрепляю - нет, уже не принимает)
сложно с логикой в unity...
не воспринимает даже старых знакомых
первый скрипт родной для prefab
второй использовал для наглядности этот же (с другим скриптом так же), просто у этого точно ошибок нет (а раз другой не воспринимает, то и заниматься им некогда)
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
1 как редактировать prefab? как в готовый pref далее добавить такие плюшки как аудио, скрипт и прочие компоненты?
2 вопрос:
хочу переместить расположение скрипта (отсортировать по папкам)
- что делать дальше? почему unity теряет связь? хоть и пробовал пересвязать скрипты в объекте.
Ну например перекину в Scripts/ , а не хочу иметь Standard Assets/Character Controllers/Sources/Scripts/FPSInputController.js
ну вот............... хотел скрипт "стрельбу" к игроку прикрутить........ а тут на те - сперва prefab добейся...........
|
(Offline)
|
|
21.06.2014, 04:28
|
#13
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Очень нужна ваша помощь
вопрос выше актуален
а пока сделал так
в Project сделал Create > Prefab
перетаскиванием мыши заменил старым в новый, переименовал в старое Player имя
и тут уже Unity разрешает делать (вроде) что хочешь
(а может всё из-за того что Player prefab был закреплён в скрипте у Camera)
а когда проект будет огромен и замудрен - как им управляются разработчики?
каждый раз детали заново откреплять-закреплять, пересоздавать?
|
(Offline)
|
|
21.06.2014, 09:37
|
#14
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Очень нужна ваша помощь
cleaning up leaked objects
|
А какие-то пакаджи в проект ты импортировал? Я уверен что при работе с префабами не будет такой ошибки. Обычно некоторые плагины забывают в своих Editor-скриптах чистить ресурсы.
1. Перетаскиваешь префаб в сцену, изменяешь и жмеш кнопку Apply. Удаляешь из сцены. Если он уже в сцене есть и помечен синим, то просто изменяешь и жмешь Apply.
2. Перемещай скрипты и другие ассеты в окне Project, а не в проводнике или другой программе. Если перемещаешь в проводнике, то не забывай перемещать файлы *.meta вместе с файлами скриптов и папками. Если их нет, то надо в проекте их включить. Включается это в меню Edit > Project Settings > Editor > Version Control = Asset Server или Visible Meta Files
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.06.2014, 19:25
|
#15
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Очень нужна ваша помощь
Сообщение от pax
2. Перемещай скрипты и другие ассеты в окне Project, а не в проводнике или другой программе.
|
в том то и дело что я поступал unity-логично и перемещал в панели project, но всё равно какая-то ошибка была.. ну пока это не так важно.
начал осваивать [RPC]
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:41.
|