Изменение цвета или прозрачности объекта

Общие вопросы о Unity3D

Изменение цвета или прозрачности объекта

Сообщение lopatka 23 авг 2011, 20:47

Добрый день. В той или иной форме этот вопрос уже задавался на форуме.Но к сожалению для меня так и не прояснился. Задача такова: - в сцене несколько объектов(мешей, вложенный префаб), 10-20шт(некоторые вложенные). Нужно по клику мыши или скрывать их выборочно. Или (что намного лучше ! ) менять материал( а лучше прозрачность) объекта. Вплоть до его исчезновения.Один клик выделение(объект подсвечивается), второй клик 50% прозрачности, третий клик нулевая видимость.Ну и желательно иметь возможность вернуть видимость всех таким образом скрытых объектов.
Сейчас у меня на камере для вращения вокруг этой группы висит найденный в сети скрипт :

Синтаксис:
Используется csharp
using UnityEngine;

using System.Collections;





[AddComponentMenu("Camera-Control/3dsMax Camera Style")]

public class maxCamera : MonoBehaviour

{

    public Transform target;

    public Vector3 targetOffset;

    public float distance = 5.0f;

    public float maxDistance = 20;

    public float minDistance = .6f;

    public float xSpeed = 200.0f;

    public float ySpeed = 200.0f;

    public int yMinLimit = -80;

    public int yMaxLimit = 80;

    public int zoomRate = 40;

    public float panSpeed = 0.3f;

    public float zoomDampening = 5.0f;



    private float xDeg = 0.0f;

    private float yDeg = 0.0f;

    private float currentDistance;

    private float desiredDistance;

    private Quaternion currentRotation;

    private Quaternion desiredRotation;

    private Quaternion rotation;

    private Vector3 position;



    void Start() { Init(); }

    void OnEnable() { Init(); }



    public void Init()

    {

        //If there is no target, create a temporary target at 'distance' from the cameras current viewpoint

        if (!target)

        {

            GameObject go = new GameObject("Cam Target");

            go.transform.position = transform.position + (transform.forward * distance);

            target = go.transform;

        }



        distance = Vector3.Distance(transform.position, target.position);

        currentDistance = distance;

        desiredDistance = distance;

               

        //be sure to grab the current rotations as starting points.

        position = transform.position;

        rotation = transform.rotation;

        currentRotation = transform.rotation;

        desiredRotation = transform.rotation;

       

        xDeg = Vector3.Angle(Vector3.right, transform.right );

        yDeg = Vector3.Angle(Vector3.up, transform.up );

    }



    /*

     * Camera logic on LateUpdate to only update after all character movement logic has been handled.

     */


    void LateUpdate()

    {

        // If Control and Alt and Middle button? ZOOM!

        if (Input.GetMouseButton(1))

        {

            desiredDistance -= Input.GetAxis("Mouse X") * Time.deltaTime * zoomRate*0.125f * Mathf.Abs(desiredDistance);

        }

        // If middle mouse and left alt are selected? ORBIT

        else if (Input.GetMouseButton(0))

        {

            xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;

            yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;



            ////////OrbitAngle



            //Clamp the vertical axis for the orbit

            yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);

            // set camera rotation

            desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);

            currentRotation = transform.rotation;

           

            rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);

            transform.rotation = rotation;

        }

        // otherwise if middle mouse is selected, we pan by way of transforming the target in screenspace

        else if (Input.GetMouseButton(2))

        {

            //grab the rotation of the camera so we can move in a psuedo local XY space

            target.rotation = transform.rotation;

            target.Translate(Vector3.right * -Input.GetAxis("Mouse X") * panSpeed);

            target.Translate(transform.up * -Input.GetAxis("Mouse Y") * panSpeed, Space.World);

        }



        ////////Orbit Position



        // affect the desired Zoom distance if we roll the scrollwheel

        desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance);

        //clamp the zoom min/max

        desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);

        // For smoothing of the zoom, lerp distance

        currentDistance = Mathf.Lerp(currentDistance, desiredDistance, Time.deltaTime * zoomDampening);



        // calculate position based on the new currentDistance

        position = target.position - (rotation * Vector3.forward * currentDistance + targetOffset);

        transform.position = position;

    }



    private static float ClampAngle(float angle, float min, float max)

    {

        if (angle < -360)

            angle += 360;

        if (angle > 360)

            angle -= 360;

        return Mathf.Clamp(angle, min, max);

    }

}



Поскольку я очень слабо(а точнее совсем не...) разбираюсь в программировании, сам не осилю. Единственное, что понял по поиску в форуме - лучше это делать через Raycast.
Чем навешивать скрипт на каждый меш.
Подскажите пожалуйста в каком мне направлении копать. Или уже есть какие то готовые решения.
Может достаточно будет дополнить тот скрипт который уже весит на камере и управляет сейчас ею.
lopatka
UNец
 
Сообщения: 6
Зарегистрирован: 07 фев 2010, 05:06

Re: Изменение цвета или прозрачности объекта

Сообщение lopatka 24 авг 2011, 11:25

Нашёл вот такой код

Синтаксис:
Используется csharp
public class DebugScript : MonoBehaviour {
 private bool _debug = true;
 void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);          
            RaycastHit hit;                                                      
            if (Physics.Raycast(ray, out hit, 100))                                
            {
                if (_debug) Debug.DrawLine(ray.origin, hit.point);                
                if(hit.collider.gameObject.tag == "MyTag")                          
                    hit.collider.gameObject.renderer.material.color = Color.green;    
            }
        }
    }
}


Но Unity ругается на строку :
Синтаксис:
Используется csharp
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);


пишет что :

NullReferenceException
UnityEngine.Camera.ScreenPointToRay (Vector3 position) (at C:/BuildAgent/work/842f9557127e852/Runtime/ExportGenerated/Editor/UnityEngineCamera.cs:267)

к сожалению мне это ни о чем не говорит
example.Update () (at Assets/example.cs:10)

Может это от того что код писался под более раннюю версию Unity ?! У меня сейчас версия 3.4
lopatka
UNец
 
Сообщения: 6
Зарегистрирован: 07 фев 2010, 05:06

Re: Изменение цвета или прозрачности объекта

Сообщение seaman 24 авг 2011, 12:13

На сцене есть камера с тегом "MainCamera"?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Изменение цвета или прозрачности объекта

Сообщение lopatka 24 авг 2011, 12:33

теперь есть )) Ругань прекратилась но увы ничего не происходит. Код я брал тут http://forum.boolean.name/showthread.php?t=14383 Сделал как написано. Создал пустой объект и на него навесил скрипт. Но увы...
lopatka
UNец
 
Сообщения: 6
Зарегистрирован: 07 фев 2010, 05:06

Re: Изменение цвета или прозрачности объекта

Сообщение seaman 24 авг 2011, 13:47

У объекта, который должен окрашиваться точно тег "MyTag"?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Изменение цвета или прозрачности объекта

Сообщение lopatka 24 авг 2011, 14:10

теперь тоже есть ) Но не хватало оказывается коллайдера на объекте. Уже заработало. Спасибо большое !!!
Теперь бы для полноты начальной задачи научится также - отключать выделение у прежде выбранного объекта когда выбран следующий , включать прозрачность у объектов, скрывать их и желательно unhide all делать ...
Возможно, используя скажем этот же скрипт, но дополнив его ?
lopatka
UNец
 
Сообщения: 6
Зарегистрирован: 07 фев 2010, 05:06

Re: Изменение цвета или прозрачности объекта

Сообщение [LUkARD] 24 авг 2011, 14:34

Используй OnMouseEnter(мышка на объекте), OnMouseExit(мышка ушла с объекта), OnMouseUp(мышка нажала на объект)
здесь http://forum.boolean.name/showpost.php?p=182067&postcount=4 кстати тоже написано
Запиался на курс программирования + html!
Аватара пользователя
[LUkARD]
UNIт
 
Сообщения: 108
Зарегистрирован: 24 июн 2011, 19:37
Откуда: Оренбургская обл. г. Ясный

Re: Изменение цвета или прозрачности объекта

Сообщение seaman 24 авг 2011, 14:39

1. У Огасода:
http://ogasoda.ru/talking/viewtopic.php?p=10983#p10983
Открытый сундук закрывается когда выбираешь другой. Аналогично можно снимать выделение.
2. Прозрачность - Color.a:
http://unity3d.com/support/documentation/ScriptReference/Color-clear.html
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Изменение цвета или прозрачности объекта

Сообщение lopatka 24 авг 2011, 15:26

Спасибо ! Сразу стало над чем подумать. А то как слепой котёнок тыкался в стенки.
lopatka
UNец
 
Сообщения: 6
Зарегистрирован: 07 фев 2010, 05:06

Re: Изменение цвета или прозрачности объекта

Сообщение lopatka 25 авг 2011, 13:21

Встало дело к сожалению. Не хватает опыта и познаний. На видео http://ogasoda.ru/talking/viewtopic.php?p=10983#p10983 смотрю как баран на новые ворота. Там надо начинать с самого сначала что бы хоть приблизится к пониманию.
Вариант : -
Используй OnMouseEnter(мышка на объекте), OnMouseExit(мышка ушла с объекта), OnMouseUp(мышка нажала на объект)
здесь http://forum.boolean.name/showpost.php? ... ostcount=4 кстати тоже написано

мне больше подходит по простоте, и работает, но не могу найти как возвращать исходный материал. Так же не получается вернуть исходный материал и с помощью: -
Синтаксис:
Используется csharp
public class DebugScript : MonoBehaviour {
 private bool _debug = true;
 void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);          
            RaycastHit hit;                                                      
            if (Physics.Raycast(ray, out hit, 100))                                
            {
                if (_debug) Debug.DrawLine(ray.origin, hit.point);                
                if(hit.collider.gameObject.tag == "MyTag")                          
                    hit.collider.gameObject.renderer.material.color = Color.green;    
            }
        }
    }
}


Это вариант удобней тем что не надо навешивать скрипт на каждый меш.
lopatka
UNец
 
Сообщения: 6
Зарегистрирован: 07 фев 2010, 05:06


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14