[РЕШЕНО] Перемещение объекта мышкой. - Форум Игроделов
Пт, 17 Май 2024, 08:42 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » СКРИПТИНГ » [РЕШЕНО] Перемещение объекта мышкой. ([JS])
[РЕШЕНО] Перемещение объекта мышкой.
ReNДата: Ср, 20 Окт 2010, 14:16 | Сообщение # 1
Нет аватара
 
Сообщений: 4
Награды: 0
Репутация: 0
Статус: Offline
Предположим есть блоки разной длины, но все правильной формы. Т.е. бруски как прямоугольники.
Они находятся на поле определенной ширины и длины.
Мне нужно их перемещать мышкой строго по осям направленным вдоль их длины. Плюс чтоб они не могли толкать друг друга, перемещаться только по свободной территории.
Типа пятнашек. Все бруски могут двигаться, но только по определенным осям и только до столкновения с другим таким же блоком.
Подскажите куда копать. Возможно есть уже готовый скрипт или похожий, чтоб допилить его.
Спасибо.
 
СообщениеПредположим есть блоки разной длины, но все правильной формы. Т.е. бруски как прямоугольники.
Они находятся на поле определенной ширины и длины.
Мне нужно их перемещать мышкой строго по осям направленным вдоль их длины. Плюс чтоб они не могли толкать друг друга, перемещаться только по свободной территории.
Типа пятнашек. Все бруски могут двигаться, но только по определенным осям и только до столкновения с другим таким же блоком.
Подскажите куда копать. Возможно есть уже готовый скрипт или похожий, чтоб допилить его.
Спасибо.

Автор - ReN
Дата добавления - 20 Окт 2010 в 14:16
proektEKДата: Ср, 20 Окт 2010, 18:56 | Сообщение # 2
 
Сообщений: 493
Награды: 6
Репутация: 193
Статус: Offline
С кодом перемещения мышью могу поделиться а на счет "только до столкновения с другим таким же блоком" изучайте справку Collision
Код:
Code
var speed:float;
function FixedUpdate ()    
{
if (Input.GetButton ("Fire1"))    
{
var ray : Ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastHit;
if (Physics.Raycast (ray, hit))    
{
zz = hit.transform.position.z+Input.GetAxis("Mouse Y")* speed;
hit.transform.position=new Vector3(hit.transform.position.x, hit.transform.position.y, zz);
}
}
}


Код вешайте на камеру, при наведении на объект нажимаем Mouse1 и двигаем вверх и вниз.


Сообщение отредактировал proektEK - Ср, 20 Окт 2010, 18:59
 
СообщениеС кодом перемещения мышью могу поделиться а на счет "только до столкновения с другим таким же блоком" изучайте справку Collision
Код:
Code
var speed:float;
function FixedUpdate ()    
{
if (Input.GetButton ("Fire1"))    
{
var ray : Ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastHit;
if (Physics.Raycast (ray, hit))    
{
zz = hit.transform.position.z+Input.GetAxis("Mouse Y")* speed;
hit.transform.position=new Vector3(hit.transform.position.x, hit.transform.position.y, zz);
}
}
}


Код вешайте на камеру, при наведении на объект нажимаем Mouse1 и двигаем вверх и вниз.

Автор - proektEK
Дата добавления - 20 Окт 2010 в 18:56
СкептикДата: Чт, 21 Окт 2010, 18:50 | Сообщение # 3
Мыслитель
 
Сообщений: 5860
Награды: 48
Репутация: 1731
Статус: Offline
Вешайте коллайдеры на блоки, чтобы они не проходили друг сквозь друга.
Чтобы двигались только по определенных осях, в каждом кадре приравнивайте положение трасформа по других осях равным определенному значению.


Фанат игр Max Payne и Fahrenheit.
 
СообщениеВешайте коллайдеры на блоки, чтобы они не проходили друг сквозь друга.
Чтобы двигались только по определенных осях, в каждом кадре приравнивайте положение трасформа по других осях равным определенному значению.

Автор - Скептик
Дата добавления - 21 Окт 2010 в 18:50
ReNДата: Пт, 22 Окт 2010, 13:44 | Сообщение # 4
Нет аватара
 
Сообщений: 4
Награды: 0
Репутация: 0
Статус: Offline
Спасибо за советы. Вот что наваял smile
Code
public var posX : float;
//public var posY : float;
public var posZ : float;
public var mousePos : Vector3;

function Update(){
  posX = transform.position.x;
  //posY = transform.position.y;
  posZ = transform.position.z;
  var e : Event = Event.current;
}

function OnMouseDrag(){
  mousePos = Camera.main.ScreenToViewportPoint(Input.mousePosition);
  transform.position = new Vector3(mousePos.x, transform.position.y, transform.position.z);
}

Однако, если крутить сцену и перевернуть ее на 180, то получается что мышка идет вправо (например), а бокс влево.
Т.е. нужно как-то изменить координаты в общие или наоборот (как правильно назвать?).
Кроме того коллайдеры не помогают. Бокс заходит в бокс, но не глубоко. Потом просто смещеается в сторону.
Плюс ко всему, если хватать передвинутый бокс, он перемещается согласно координат мыши сразу. Т.е. нужно работать не с прямыми координатами мыши, а с дельтой (где поискать?).

 
СообщениеСпасибо за советы. Вот что наваял smile
Code
public var posX : float;
//public var posY : float;
public var posZ : float;
public var mousePos : Vector3;

function Update(){
  posX = transform.position.x;
  //posY = transform.position.y;
  posZ = transform.position.z;
  var e : Event = Event.current;
}

function OnMouseDrag(){
  mousePos = Camera.main.ScreenToViewportPoint(Input.mousePosition);
  transform.position = new Vector3(mousePos.x, transform.position.y, transform.position.z);
}

Однако, если крутить сцену и перевернуть ее на 180, то получается что мышка идет вправо (например), а бокс влево.
Т.е. нужно как-то изменить координаты в общие или наоборот (как правильно назвать?).
Кроме того коллайдеры не помогают. Бокс заходит в бокс, но не глубоко. Потом просто смещеается в сторону.
Плюс ко всему, если хватать передвинутый бокс, он перемещается согласно координат мыши сразу. Т.е. нужно работать не с прямыми координатами мыши, а с дельтой (где поискать?).


Автор - ReN
Дата добавления - 22 Окт 2010 в 13:44
proektEKДата: Пт, 22 Окт 2010, 20:38 | Сообщение # 5
 
Сообщений: 493
Награды: 6
Репутация: 193
Статус: Offline
Я ж выложил скрипт в нем перемещается объект по своим координатам просто к одной из них добавляются значения перемещения мыши.
Выложите скрины с проблемой.
 
СообщениеЯ ж выложил скрипт в нем перемещается объект по своим координатам просто к одной из них добавляются значения перемещения мыши.
Выложите скрины с проблемой.

Автор - proektEK
Дата добавления - 22 Окт 2010 в 20:38
ReNДата: Сб, 23 Окт 2010, 00:25 | Сообщение # 6
Нет аватара
 
Сообщений: 4
Награды: 0
Репутация: 0
Статус: Offline
С этим скриптом съезжает другой. На камере стоит вот этот:
Код
var target : Transform;
var distance = 10.0;
var distanceMax = 120;
var distanceMin = 30;

var xSpeed = 250.0;
var ySpeed = 120.0;

var yMinLimit = -20;
var yMaxLimit = 80;

private var x = 0.0;
private var y = 0.0;

@script AddComponentMenu("Camera-Control/Mouse Orbit")

function Start () {
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;

// Make the rigid body not change rotation
if (rigidbody)
rigidbody.freezeRotation = true;
}

function LateUpdate () {
if (target) {
if(Input.GetMouseButton(1)){
x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;

y = ClampAngle(y, yMinLimit, yMaxLimit);

var rotation = Quaternion.Euler(y, x, 0);
var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;

transform.rotation = rotation;
transform.position = position;
}
}
}

static function ClampAngle (angle : float, min : float, max : float) {
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}

Стандартный для камеры.
После того как я двигаю брусок, поворачиваю камеру - она вертится не вокруг того что я назначил ей как цель.
Оказывается двигается еще и поле на котором лежат бруски. Галка статик стоит. Коллайдеры навешаны. Что не так?

Добавлено (23.10.2010, 00:25)
---------------------------------------------
Наконец-то раздуплился smile Положил все лишнее в Ignore Raycast. Работает.
Коллайдеры не помогают.
 
СообщениеС этим скриптом съезжает другой. На камере стоит вот этот:
Код
var target : Transform;
var distance = 10.0;
var distanceMax = 120;
var distanceMin = 30;

var xSpeed = 250.0;
var ySpeed = 120.0;

var yMinLimit = -20;
var yMaxLimit = 80;

private var x = 0.0;
private var y = 0.0;

@script AddComponentMenu("Camera-Control/Mouse Orbit")

function Start () {
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;

// Make the rigid body not change rotation
if (rigidbody)
rigidbody.freezeRotation = true;
}

function LateUpdate () {
if (target) {
if(Input.GetMouseButton(1)){
x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;

y = ClampAngle(y, yMinLimit, yMaxLimit);

var rotation = Quaternion.Euler(y, x, 0);
var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;

transform.rotation = rotation;
transform.position = position;
}
}
}

static function ClampAngle (angle : float, min : float, max : float) {
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}

Стандартный для камеры.
После того как я двигаю брусок, поворачиваю камеру - она вертится не вокруг того что я назначил ей как цель.
Оказывается двигается еще и поле на котором лежат бруски. Галка статик стоит. Коллайдеры навешаны. Что не так?

Добавлено (23.10.2010, 00:25)
---------------------------------------------
Наконец-то раздуплился smile Положил все лишнее в Ignore Raycast. Работает.
Коллайдеры не помогают.

Автор - ReN
Дата добавления - 23 Окт 2010 в 00:25
Форум Игроделов » UNITY3D » СКРИПТИНГ » [РЕШЕНО] Перемещение объекта мышкой. ([JS])
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024