Прикрутить скрипт к камере

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Прикрутить скрипт к камере

Сообщение ivan-korobko 19 ноя 2012, 12:48

Доброго времени суток! Я только-только начал осваивать сей продукт и скачал Free-версию Unity3d 4.

Вопрос №1

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

Есть terrain, есть камера(параллельна террэйну, смотрит на него сверху вниз) - я хочу, чтобы перемещение камеры происходило посредством мыши(по типу RTS). Посему нашел в интернете следующий скрипт:

Синтаксис:
Используется csharp
    using UnityEngine;
    using System.Collections;
     
    public class CameraMovement : MonoBehaviour {
        //-------------------------------------------------------//
        private Vector2 mouseButton2DownPoint, mouseButton2UpPoint;   // точки, в которых мы нажали и отпустили правую кнопку мыши (по умолчанию отвечает за движение)
        private Vector2 turnButtonDownPoint;                          // точка, в которой мы зажали клавишу поворота
        private bool    dragMouse, turnCamera;                         // перемещать и поворачивать ли мышь
        //-------------------------------------------------------//
     
        //-------------------------------------------------------//
        public GameObject camera;                                        // ГО используемой камеры
        public float      cameraMoveSpeedDamper = 0.02f;                 // коэффицент скорости перемещения мыши
        public float      maxCamHeight;
        private float     minCamHeight;
        public float      mouseWheelSpeed = 150.0f;                      // скорость масштабирования поля колесиком мышки
        //-------------------------------------------------------//
     
     
        void Start()
        {
           minCamHeight = Terrain.activeTerrain.SampleHeight(camera.transform.position);
        }
     
            // Update is called once per frame
        void Update()
        {
            minCamHeight = Terrain.activeTerrain.SampleHeight(camera.transform.position);
            if (Input.GetButtonDown("Move Camera"))
            {
                mouseButton2DownPoint = Input.mousePosition;
                dragMouse = true;
            }
     
            if (Input.GetButtonUp("Move Camera"))
            {
                dragMouse = false;
                mouseButton2UpPoint = Input.mousePosition;
            }
     
            if (Input.GetButtonDown("Turn Camera"))
            {
                turnCamera = true;
                turnButtonDownPoint = Input.mousePosition;
            }
     
            if (Input.GetButtonUp("Turn Camera"))
            {
                turnCamera = false;    
            }
     
            if (dragMouse)     // перемещать ли камеру
                {
     
                Vector2 dragDifference =  mouseButton2DownPoint - (Vector2)(Input.mousePosition);     // на сколько юзер передвинул мышку
                        // устанавливаем вектору движения разницу между положениями мыши
                        Vector3 moveDirection = new Vector3(-dragDifference.x, 0, -dragDifference.y);
                        // Translating so move relative to where the camera currently is located
                        transform.Translate(moveDirection * cameraMoveSpeedDamper);
                }
     
            if (turnCamera)    // поворачивать ли камеру
            {
                //transform.rotation *  
                Vector2 turnDifference = turnButtonDownPoint - (Vector2)(Input.mousePosition);     // на сколько юзер повернул мышку
                Vector3 turnDirection = new Vector3(-turnDifference.x, -turnDifference.x, -turnDifference.y);
       
                //Quaternion zrot =  Quaternion.AngleAxis(transform.rotation.eulerAngles.x + (-turnDifference.y * cameraMoveSpeedDamper * 10), Vector3.left);
                transform.rotation = Quaternion.AngleAxis(transform.rotation.eulerAngles.y + (turnDirection.y * cameraMoveSpeedDamper), Vector3.up);
            }
     
            float mouseWheel = Input.GetAxis("Mouse ScrollWheel");        
           
            //if (mouseWheel != 0)                                     // если пользователь крутил колесико мышки
                {
                float currentHeight =  camera.transform.position.y;
                        // изменить высоту камер основываясь на заданной скорости
                        currentHeight -= mouseWheel * mouseWheelSpeed * Time.deltaTime;
                        // установить высоту камеры, не переходя мин/макс значений
                if (currentHeight <= (minCamHeight + 3)) currentHeight = Terrain.activeTerrain.SampleHeight(camera.transform.position) + 5;
                if (!(currentHeight <= minCamHeight) && !(currentHeight >= maxCamHeight))
                {
                    transform.position = new Vector3(transform.position.x, currentHeight, transform.position.z);
                    camera.transform.position = new Vector3(camera.transform.position.x, currentHeight, camera.transform.position.z);
                }
                }
     
           
            }
    }


По комментариям в скрипте я примерно понял, что за что отвечает, но проблема в самом банальном наверное - как мне прикрутить этот скрипт к самой камере?) Я пробовал "Add Component" -> "New Script" -> "C#" -> Name = CameraMovement... Да я понимаю, что я нуб, но помогите кто как сможет - где я ошибся в своем алгоритме действий или дайте ссылочку на похожий по моему вопросу туториал...

Вопрос №2

Есть допустим исходник какого-либо приложения для Unity3d - как собственно его открыть с помощью Юнити?)) Там должен быть какой-то исполняющий файл? или что-то надо просто скопировать в корневую папку моего Юнити?

Такие вот детские вопросы, но если кто-то окажет помощь в разжевывании (а не отправит покорять просторы библиотек(в свободное время именно этим и занимаюсь)) буду очень признателен!
ivan-korobko
UNец
 
Сообщения: 3
Зарегистрирован: 19 ноя 2012, 12:28

Re: Прикрутить скрипт к камере

Сообщение Kirsan12 19 ноя 2012, 12:53

1. Нужно просто перетащить файл скрипта на камеру(или другой объект).
2. File -> Open Project и указываете путь до скаченого проекта Юнити3д.
Kirsan12
UNец
 
Сообщения: 8
Зарегистрирован: 12 ноя 2012, 15:10

Re: Прикрутить скрипт к камере

Сообщение ivan-korobko 19 ноя 2012, 13:07

После перетаскивания скрипта на камеру так же ничего не работает(камера то работает, но мертвая - не движется)... может проблемма в самом скрипте? (хотя это уже 3ий скрипт, отзывами на который было нечто вроде "Молодец, всё спер, спасибо, помог") - значит всё-таки я чего-то не так делаю...
ivan-korobko
UNец
 
Сообщения: 3
Зарегистрирован: 19 ноя 2012, 12:28

Re: Прикрутить скрипт к камере

Сообщение Kirsan12 19 ноя 2012, 13:19

Я бы все таки посоветовал сначала поразбираться с легкими скриптами, а уже потом пытаться разбираться в более сложных...
Можно начать с этих видеоуроков: http://www.unity3dstudent.com/category/ ... /beginner/
Kirsan12
UNец
 
Сообщения: 8
Зарегистрирован: 12 ноя 2012, 15:10

Re: Прикрутить скрипт к камере

Сообщение Receptor 19 ноя 2012, 14:13

Судя по скрипту не обязательно вешать скрипт на камеру, достаточно повесить его на любой пустой го.

Проблема может бы в том, что у Вас переменная GameObject camera не установлена. Если быть точнее, гляньте в начало скрипта
Синтаксис:
Используется csharp
 public GameObject camera;  
 

после того, как вы повесите скрипт на любой объект, на нем появятся "насктройки" скрипта, а именно - это все переменные public, которые объявляются в самом начале скрипта.

Попробуйте следующее: тыкните на ваш объект, на котором висит скрипт, найдите в "настройках" скрипта ячейку Сamera и выбирите в ней свою камеру, или просто можете из цены перетащить в эту ячейку.

Первые мои вопросы были подобного характера, не касающиеся самого программирования в принципе :) Советую стандартные туториалы пройти, времени много не займет, много чего поймете
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Прикрутить скрипт к камере

Сообщение ivan-korobko 20 ноя 2012, 08:45

Ладненько, спасибо всем за советы - все равно ничего не получилось(пытался вешать скрипт всеми описаными способами, но увы))) Видимо и вправду не с того конца взялся - уже в закачке 34гб туториалов рус+инг - как говорят у нас в электрике "сначала научись схемы читать, а после в щитовую лезь" :-B

Прикрутил зато другую камеру)
Синтаксис:
Используется csharp
using UnityEngine;
 
public class MouseRts : MonoBehaviour
{
    public int LevelArea = 100;
 
    public int ScrollArea = 25;
    public int ScrollSpeed = 25;
    public int DragSpeed = 100;
 
    public int ZoomSpeed = 25;
    public int ZoomMin = 20;
    public int ZoomMax = 100;
 
    public int PanSpeed = 50;
    public int PanAngleMin = 25;
    public int PanAngleMax = 80;
 
    // Update is called once per frame
    void Update()
    {
        // Init camera translation for this frame.
        var translation = Vector3.zero;
 
        // Zoom in or out
        var zoomDelta = Input.GetAxis("Mouse ScrollWheel")*ZoomSpeed*Time.deltaTime;
        if (zoomDelta!=0)
        {
            translation -= Vector3.up * ZoomSpeed * zoomDelta;
        }
 
        // Start panning camera if zooming in close to the ground or if just zooming out.
        var pan = camera.transform.eulerAngles.x - zoomDelta * PanSpeed;
        pan = Mathf.Clamp(pan, PanAngleMin, PanAngleMax);
        if (zoomDelta < 0 || camera.transform.position.y < (ZoomMax / 2))
        {
            camera.transform.eulerAngles = new Vector3(pan, 0, 0);
        }
 
        // Move camera with arrow keys
        translation += new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
 
        // Move camera with mouse
        if (Input.GetMouseButton(2)) // MMB
        {
            // Hold button and drag camera around
            translation -= new Vector3(Input.GetAxis("Mouse X") * DragSpeed * Time.deltaTime, 0,
                               Input.GetAxis("Mouse Y") * DragSpeed * Time.deltaTime);
        }
        else
        {
            // Move camera if mouse pointer reaches screen borders
            if (Input.mousePosition.x < ScrollArea)
            {
                translation += Vector3.right * -ScrollSpeed * Time.deltaTime;
            }
 
            if (Input.mousePosition.x >= Screen.width - ScrollArea)
            {
                translation += Vector3.right * ScrollSpeed * Time.deltaTime;
            }
 
            if (Input.mousePosition.y < ScrollArea)
            {
                translation += Vector3.forward * -ScrollSpeed * Time.deltaTime;
            }
 
            if (Input.mousePosition.y > Screen.height - ScrollArea)
            {
                translation += Vector3.forward * ScrollSpeed * Time.deltaTime;
            }
        }
 
        // Keep camera within level and zoom area
        var desiredPosition = camera.transform.position + translation;
        if (desiredPosition.x < -LevelArea || LevelArea < desiredPosition.x)
        {
            translation.x = 0;
        }
        if (desiredPosition.y < ZoomMin || ZoomMax < desiredPosition.y)
        {
            translation.y = 0;
        }
        if (desiredPosition.z < -LevelArea || LevelArea < desiredPosition.z)
        {
            translation.z = 0;
        }
 
        // Finally move camera parallel to world axis
        camera.transform.position += translation;
    }
}


Эта как ни странно работает - может баг в самом скрипте был? или писался для версии не совместимой с четверкой? :|
ivan-korobko
UNец
 
Сообщения: 3
Зарегистрирован: 19 ноя 2012, 12:28


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 20