如果光线投射没有击中物体 - 将 material 颜色更改为白色
If raycast is not hitting an object - change the material color to white
我正在为我的 IT 使用 Unity 开发一个小型学校项目 类。
我在 Unityscript 中创建了一个脚本,当光线投射命中并带有特定标签的对象时,它会显示特定的 GUI。我还希望它在光线投射到对象碰撞器时立即将 material 颜色更改为黄色。这是我设法做到的部分。
现在我希望我的脚本在光线投射停止撞击对象碰撞器时将颜色改回白色,但我想不出任何方法来做到这一点。
有人可以帮帮我吗?提前致谢!
这是我的代码 - 我知道它很乱,但这是我第一次编写更复杂的代码。
啊,因为我只是对其进行测试,所以 material 更改仅在 "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 ");
}
}
在您的更新函数中,您可以将当前着色为黄色的对象保存在变量 highlightedGameObject 中,并将其与上次突出显示的游戏对象进行比较。如果它们不同,则使最后一个变白;通过将 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;
}
希望对您有所帮助=)
我正在为我的 IT 使用 Unity 开发一个小型学校项目 类。 我在 Unityscript 中创建了一个脚本,当光线投射命中并带有特定标签的对象时,它会显示特定的 GUI。我还希望它在光线投射到对象碰撞器时立即将 material 颜色更改为黄色。这是我设法做到的部分。 现在我希望我的脚本在光线投射停止撞击对象碰撞器时将颜色改回白色,但我想不出任何方法来做到这一点。
有人可以帮帮我吗?提前致谢!
这是我的代码 - 我知道它很乱,但这是我第一次编写更复杂的代码。
啊,因为我只是对其进行测试,所以 material 更改仅在 "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 ");
}
}
在您的更新函数中,您可以将当前着色为黄色的对象保存在变量 highlightedGameObject 中,并将其与上次突出显示的游戏对象进行比较。如果它们不同,则使最后一个变白;通过将 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;
}
希望对您有所帮助=)