как установить значение подсветки сохранено? - PullRequest
1 голос
/ 29 октября 2019

У меня есть объект в Unity, и когда я нахожу его, он подсвечивает этот конкретный объект, но что я хочу сделать, это когда я нахожу и он подсвечивается - я хочу выбрать и сохранить это значение подсветки, чтобы оно отображалось стабильно и неподвижно на этом объекте? Есть ли способ с моим кодом ниже? Спасибо за помощь.

Вот мой код выделения:

public class Highlights : MonoBehaviour {

        public Material highlightMaterial;
        Material originalMaterial;
        GameObject lastHighlightedObject;

        void HighlightObject(GameObject gameObject)
        {
            if (lastHighlightedObject != gameObject)
            {
                ClearHighlighted();
                originalMaterial = gameObject.GetComponent<MeshRenderer>().sharedMaterial;
                gameObject.GetComponent<MeshRenderer>().sharedMaterial = highlightMaterial;
                lastHighlightedObject = gameObject;
            } 
        }

        void ClearHighlighted()
        {
            if (lastHighlightedObject != null)
            {
                lastHighlightedObject.GetComponent<MeshRenderer>().sharedMaterial = originalMaterial;
                lastHighlightedObject = null;
            }
        }

        // Navigates to highlight every object on camera. 
        void HighlightObjectInCenterOfCam()
        {
            float rayDistance = 1000.0f;

            // The ray from the center of the viewport.
            Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0f));
            RaycastHit rayHit;

            // Check if we hit something.
            if (Physics.Raycast(ray, out rayHit, rayDistance))
            {
                // Get the object that was hit.
                GameObject hitObject = rayHit.collider.gameObject;
                HighlightObject(hitObject);
            } else
            {
                ClearHighlighted();
            }
        }

        void Update()
        {
            HighlightObjectInCenterOfCam();
        }
    }

Мой метод для попытки захвата значения выделения при выборе:

        public void Editcomponents()
        {    
            ClearText();
            CircleImageStatus = !CircleImageStatus;
            var imgs = reticle.GetComponentsInChildren<Image>(true);
            if (CircleImageStatus)
            { 
                foreach (var img in imgs)
                {
                    img.GetComponent<Image>().color = new Color32(235, 210, 52, 255);      
                }
            }
            else
            {
                foreach (var img in imgs)
                {
                    img.GetComponent<Image>().color = new Color32(255, 255, 255, 255);               
                }
            }
        }

1 Ответ

0 голосов
/ 29 октября 2019

Добавьте логическое значение, чтобы отслеживать, установлен ли выбор или нет, который начинается false и возвращается к false всякий раз, когда выделенный объект не определен или уничтожен.

Делать любые связанные с подсветкой вещи (т. Е. Удалять или добавлять подсветки), только когда логическое значение равно false:

public class Highlights : MonoBehaviour {

    public Material highlightMaterial;
    Material originalMaterial;
    GameObject lastHighlightedObject;

    bool highlightSet; // new

    void Start() // new
    {
        highlightSet = false;
    }

    void HighlightObject(GameObject gameObject)
    {
        if (lastHighlightedObject != gameObject)
        {
            ClearHighlighted();
            originalMaterial = gameObject.GetComponent<MeshRenderer>().sharedMaterial;
            gameObject.GetComponent<MeshRenderer>().sharedMaterial = highlightMaterial;
            lastHighlightedObject = gameObject;
        } 
    }

    void ClearHighlighted()
    {
        if (lastHighlightedObject != null)
        {
            lastHighlightedObject.GetComponent<MeshRenderer>().sharedMaterial = originalMaterial;
            lastHighlightedObject = null;
        }
    }

    // Navigates to highlight every object on camera. 
    void HighlightObjectInCenterOfCam()
    {
        float rayDistance = 1000.0f;

        // The ray from the center of the viewport.
        Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0f));
        RaycastHit rayHit;

        // Check if we hit something.
        if (Physics.Raycast(ray, out rayHit, rayDistance))
        {
            // Get the object that was hit.
            GameObject hitObject = rayHit.collider.gameObject;
            HighlightObject(hitObject);
        } else
        {
            ClearHighlighted();
        }
    }

    void Update()
    {
        // unset highlight if object is null (undefined or destroyed)
        if (lastHighlightedObject == null)
        {
            highlightSet = false;
        }

        if (!highlightSet)
        {
            HighlightObjectInCenterOfCam();
        }
    }

    public void SetHighlight() 
    { 
        // only set highlight if there is a highlighted object
        if (lastHighlightedObject != null) 
            highlightSet = true; 
    }

    public void UnsetHighlight() { highlightSet = false; }

    public void SetHighlightToObject(GameObject to) {
        if (to != null) {
            HighlightObject(to);
            highlightSet = true;
        } else {
            ClearHighlighted();
        }
    }
}

В приведенном выше коде вы вызываете SetHighlight, когданеобходимо установить выделение, и UnsetHighlight, когда оно не будет установлено.

Если вы хотите установить выделение для конкретного игрового объекта, вы можете вызвать SetHighlightToObject со ссылкой на игровой объект, который вы хотитеустановлен. Вы можете получить это с помощью GameObject.Find("objectname");, где "objectname" - это что-то, хранящееся в базе данных, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...