【问题标题】:If raycast is not hitting an object - change the material color to white如果光线投射没有击中物体 - 将材质颜色更改为白色
【发布时间】:2015-04-24 15:37:33
【问题描述】:

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

谁能帮帮我?提前致谢!

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

啊,因为我只是在测试它,所以材料变化只在“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 ");
    }
}

【问题讨论】:

    标签: user-interface unity3d unityscript


    【解决方案1】:

    在您的更新函数中,您可以将当前以黄色着色的对象保存在变量 highlightGameObject 中,并将其与最后一个突出显示的游戏对象进行比较。如果它们不同,则将最后一个变为白色;通过将 highlightGameObject 保存在变量 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;
    }
    

    希望对你有帮助 =)

    【讨论】:

    • 感谢您的回答。经过几次尝试,我设法让它工作:)
    • 现在唯一的问题是,当我还没有选择对象时,它是垃圾邮件错误,没有分配 objHit。当我销毁对象时也是如此。你知道有什么办法可以解决吗?
    • 干得好;)我编辑了答案以显示我描述的代码,以防万一其他人看到。如果您有错误显示,只需在将最后一个突出显示的游戏对象设置为白色之前添加 if (objHit != null),它应该可以解决问题。
    • 非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2022-06-15
    • 1970-01-01
    • 2021-11-08
    • 2017-05-20
    相关资源
    最近更新 更多