Предположим есть блоки разной длины, но все правильной формы. Т.е. бруски как прямоугольники. Они находятся на поле определенной ширины и длины. Мне нужно их перемещать мышкой строго по осям направленным вдоль их длины. Плюс чтоб они не могли толкать друг друга, перемещаться только по свободной территории. Типа пятнашек. Все бруски могут двигаться, но только по определенным осям и только до столкновения с другим таким же блоком. Подскажите куда копать. Возможно есть уже готовый скрипт или похожий, чтоб допилить его. Спасибо.
С кодом перемещения мышью могу поделиться а на счет "только до столкновения с другим таким же блоком" изучайте справку 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
Вешайте коллайдеры на блоки, чтобы они не проходили друг сквозь друга. Чтобы двигались только по определенных осях, в каждом кадре приравнивайте положение трасформа по других осях равным определенному значению. Фанат игр Max Payne и Fahrenheit.
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, то получается что мышка идет вправо (например), а бокс влево. Т.е. нужно как-то изменить координаты в общие или наоборот (как правильно назвать?). Кроме того коллайдеры не помогают. Бокс заходит в бокс, но не глубоко. Потом просто смещеается в сторону. Плюс ко всему, если хватать передвинутый бокс, он перемещается согласно координат мыши сразу. Т.е. нужно работать не с прямыми координатами мыши, а с дельтой (где поискать?).
Я ж выложил скрипт в нем перемещается объект по своим координатам просто к одной из них добавляются значения перемещения мыши. Выложите скрины с проблемой.
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) --------------------------------------------- Наконец-то раздуплился Положил все лишнее в Ignore Raycast. Работает. Коллайдеры не помогают.