如果raycast未击中对象 - 将材质颜色更改为白色

时间:2015-02-23 10:30:45

标签: user-interface unity3d unityscript

我正在Unity的一个小型学校项目中为我的IT课程。 我在Unityscript中创建了一个脚本,当光线投射命中并使用特定标记对象时,该脚本显示特定的GUI。我还希望它在光线投射到物体对撞机时立即将材质颜色更改为黄色。这是我设法做的部分。 现在我希望我的脚本在光线投射停止撞击对象colider时将颜色更改为白色,但我想不出有任何方法可以做到这一点。

有人可以帮我吗?提前谢谢!

这是我的代码 - 我知道它很乱,但这是我第一次编写任何更复杂的代码。

啊,因为我只测试它,所以材料更改只在“Wood”标签上。

感谢Romain Soual的工作代码:

#pragma strict

var rayLength : int = 2;

private var inventory : Inventory;

private var showGUI : boolean = false;

var bush : GameObject;
var player : GameObject;

var objHit : GameObject;

function Start()
{
    inventory = GameObject.Find("First Person Controller").GetComponent(Inventory);
}

function Update()
{
    var hit : RaycastHit;

    var forward = transform.TransformDirection(Vector3.forward);

    if(Physics.Raycast(transform.position, forward, hit, rayLength))
    {
        if(hit.collider.gameObject.tag == "Wood")
        {   
            objHit = hit.collider.gameObject;       
            showGUI = true;
            objHit.collider.gameObject.renderer.material.color = Color.yellow;

            if(Input.GetKeyDown("e"))
            {
                inventory.wood++;
                Destroy(hit.collider.gameObject);
                showGUI = false;
            }
        }
        else if(hit.collider.gameObject.tag == "Sticks")
        {
            showGUI = true;

            if(Input.GetKeyDown("e"))
            {
                inventory.stick++;
                Destroy(hit.collider.gameObject);
                showGUI = false;
            }
        }
        else if(hit.collider.gameObject.tag == "BushFull")
        {
            showGUI = true;
            bush = (hit.collider.gameObject);

            if(Input.GetKeyDown("e"))
            {
                inventory.berry += 5;
                bush.GetComponent(BushController).berriesTaken = true;
                showGUI = false;
            }
        }
        else if(hit.collider.gameObject.tag == "Stones")
        {
            showGUI = true;

            if(Input.GetKeyDown("e"))
            {
                inventory.stone++;
                Destroy(hit.collider.gameObject);
                showGUI = false;
            }
        }
        else if(hit.collider.gameObject.tag == "Pickaxe")
        {
            showGUI = true;

            if(Input.GetKeyDown("e"))
            {
                inventory.pickaxe++;
                Destroy(hit.collider.gameObject);
                showGUI = false;
            }
        }
        else if(hit.collider.gameObject.tag == "Axe")
        {
            showGUI = true;

            if(Input.GetKeyDown("e"))
            {
                inventory.axe++;
                Destroy(hit.collider.gameObject);
                showGUI = false;
            }
        }
        else
        {
            objHit.collider.gameObject.renderer.material.color = Color.white;
            showGUI = false;            
        }
    }
    else
    {
        objHit.collider.gameObject.renderer.material.color = Color.white;
        showGUI = false;        //jesli gracz oddali sie od obiektu to okienko "pick up" znika
    }
}

function OnGUI()
{
    if(showGUI == true)
    {
        GUI.Box(Rect(Screen.width / 2, Screen.height / 2, 100, 25), "Pick up ");
    }
}

1 个答案:

答案 0 :(得分:1)

在Update函数中,您可以将当前对象以黄色保存在变量highlightGameObject中,并将其与最后突出显示的游戏对象进行比较。如果它们不同,请将最后一个变为白色;通过将highlightedGameObject保存在变量lastHighlightedGameObject中来结束该函数。

var highlightedGameObject;
var lastHighlightedGameObject;

function Update () {
[...]
highlightedGameObject = hit.collider.gameObject;
highlightedGameObject.renderer.material.color = Color.yellow;
[...]
if (highlightedGameObject != lastHighlightedGameObject && lastHighlightedGameObject != null) {
    lastHighlightedGameObject.renderer.material.color = Color.white;
}
lastHighlightedGameObject = highlightedGameObject;
}

我希望帮助=)