【问题标题】:Script only working on one object in scene脚本仅适用于场景中的一个对象
【发布时间】:2019-02-12 12:26:47
【问题描述】:

如您所见,我从场景中的一个对象开始,并将脚本与其他组件一起附加到它。 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;
    }
}
}

总而言之,预期的结果是第二个(或更多)对象的工作方式与第一个对象相同。

实际上并没有。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多