脚本仅对场景中的一个对象起作用

时间:2019-02-11 23:34:42

标签: c# unity3d

如您所见,我从场景中的对象开始,然后将脚本以及其他组件附加到该对象。 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 :(得分:0)

我能够通过将扫描放入awake()方法来解决此问题。