Скрипт работает только над одним объектом в сцене - PullRequest
0 голосов
/ 12 февраля 2019

Как видите, я начал с объекта на сцене и прикрепил к нему скрипт вместе с другими компонентами.https://imgur.com/z9Tooh9

Это выглядит бесплодным из-за того, что там на самом деле нет модели.Однако, когда игра запускается, она создается другим сценарием в объекте в иерархии.https://imgur.com/guQQlJO

Вы также можете видеть, что скрипт работает должным образом, обнаруживает все средства визуализации мешей и позволяет соответствующим образом настраивать цвета.

Однако проблема заключается именно в этом..

Когда я дублирую этот объект, первый объект делает то, что от него ожидают, а второй нет.

Как вы можете видеть, в списке нет обработчиков рендеринга сетки.для второго объекта.https://imgur.com/zTRHL9F

Естественно, я помещаю журналы отладки в то место, где он обнаруживает обработчики скинов с сеткой, чтобы увидеть, в чем проблема:

void OnMouseEnter()
{
    Debug.Log("Mouse Entered");
    foreach (SkinnedMeshRenderer element in skinnedMeshRenderersScan) //For 
every object it finds
    {
        Debug.Log("Detected: " + element);
        Debug.Log("Detected Color: " + selectedColor);
        element.material.color = selectedColor;
    }
}

void OnMouseExit()
{
    Debug.Log("Mouse Left");
    foreach (SkinnedMeshRenderer element in skinnedMeshRenderersScan) //For 
every object it finds
    {
        //Debug.Log("Detected: " + element);
        //Debug.Log("Detected Color: " + deselectedColor);
        element.material.color = deselectedColor;
    }
}

Первый объект отмечает, что они обнаружены,https://imgur.com/fBhXjKj

Второй просто делает вид, что журнала отладки даже нет.https://imgur.com/alE76aY

Я более чем рад уточнить, если вы не совсем понимаете, о чем я спрашиваю.

Большое спасибо заранее и извините, если я отформатировалУжасно, я не лучший в этом вопросе.

Я пытался искать ответы в Интернете, но не смог найти решение моей довольно уникальной проблемы.

Весь сценарий такойследует:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TankController : MonoBehaviour
{

Vector3 targetPosition;
Vector3 lookAtTarget;

public Vector4 selectedColor;
public Vector4 deselectedColor;

Quaternion playerRot;

float rotSpeed = 2;
float speed = 3;

bool moving = false;
public bool Building = false;
public bool selected = false;
public bool CoolingDown = false;

public double CoolDown = .2;
public double original = .2;

MeshRenderer RenderMesh;
MeshRenderer RenderMeshParent;

SkinnedMeshRenderer[] skinnedMeshRenderersScan;
public List<SkinnedMeshRenderer> skinnedMeshRenderersList = new 
List<SkinnedMeshRenderer>();

// Use this for initialization
void Start()
{
    RenderMesh = GetComponentInChildren<MeshRenderer>();
    RenderMeshParent = GetComponentInParent<MeshRenderer>();

    skinnedMeshRenderersScan = GetComponentsInChildren<SkinnedMeshRenderer> ();

    foreach (SkinnedMeshRenderer element in skinnedMeshRenderersScan) //For every object it finds
    {
        if (!skinnedMeshRenderersList.Contains(element)) //If it isn't already in this list
        {
            skinnedMeshRenderersList.Add(element); //Add to the list
        }
    }
}

// Update is called once per frame
void Update()
{

    if (Input.GetMouseButton(0))
    {
        if (CoolingDown == false) //If not cooling down
        {
            SetTargetPosition();
            CoolingDown = true; //Set cooling down to true
        }
    }
    if (CoolingDown == true)
    {
        CoolDown -= Time.deltaTime; //Takes some time away
        if (CoolDown <= 0) //Checks if the cooldown is done yet
        {
            CoolingDown = false; //Sets cooling down to false
            CoolDown = original; //Cooldown timer is reset by equalling its original value
        }
    }
    if (moving)
        Move();
}

void SetTargetPosition()
{

    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, Mathf.Infinity))
        {

            if (hit.collider.CompareTag("Hittable") == true && selected == true)
            {
                targetPosition = hit.point;
                lookAtTarget = new Vector3(targetPosition.x - transform.position.x,
                transform.position.y,
                targetPosition.z - transform.position.z);
                playerRot = Quaternion.LookRotation(lookAtTarget);
                moving = true;
            }

            if (hit.collider.CompareTag("Unit") == true)
            {

                Fighting self = GetComponentInChildren<Fighting>();

                Fighting other = hit.collider.gameObject.GetComponentInChildren<Fighting>();

                PlayerMaster playcheck = GetComponent<PlayerMaster>();

                if (CoolingDown == false) //If not cooling down
                {
                    if (gameObject.name == hit.collider.name)
                    {
                        if (selected == false)
                        {
                            selected = true;

                            RenderMesh.enabled = !RenderMesh.enabled;
                        }
                        else if (selected == true)
                        {
                            selected = false;

                            RenderMesh.enabled = !RenderMesh.enabled;
                        }
                    }

                    CoolingDown = true; //Set cooling down to true
                }
            }
        }
    }
}

void Move()
{
    if (Building == false)
    {
        transform.rotation = Quaternion.Slerp(transform.rotation,
                                                playerRot,
                                                rotSpeed * Time.deltaTime);
        transform.position = Vector3.MoveTowards(transform.position,
                                                targetPosition,
                                                speed * Time.deltaTime);

        if (transform.position == targetPosition)
            moving = false;
    }
}

void OnMouseEnter()
{
    Debug.Log("Mouse Entered");
    foreach (SkinnedMeshRenderer element in skinnedMeshRenderersScan) //For every object it finds
    {
        Debug.Log("Detected: " + element);
        Debug.Log("Detected Color: " + selectedColor);
        element.material.color = selectedColor;
    }
}

void OnMouseExit()
{
    Debug.Log("Mouse Left");
    foreach (SkinnedMeshRenderer element in skinnedMeshRenderersScan) //For every object it finds
    {
        //Debug.Log("Detected: " + element);
        //Debug.Log("Detected Color: " + deselectedColor);
        element.material.color = deselectedColor;
    }
}
}

Напомним, ожидаемый результат состоит в том, что второй объект (или более) будет работать так же, как первый объект.

На практике это не так.

1 Ответ

0 голосов
/ 12 февраля 2019

Мне удалось решить эту проблему, поместив сканы в метод awake ().

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