1. 程式人生 > 實用技巧 >點選三維按鈕之射線觸發

點選三維按鈕之射線觸發

1.列出所有按鈕的列舉型別

2.建立指令碼ElectricalCabinetControlGenerator_CabinetButtonManager

3.將對應的按鈕新增該指令碼,並選擇自己對應的列舉型別,並給每個按鈕新增BoxCollider元件,勾選is Trigger

4.建立指令碼管理動畫,按鈕,邏輯等
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
namespace ElectricPower.WindPower
{
public class ElectricalControllerGeneratorManager : MonoBehaviour
{
[SerializeField] private Animator ani_ElectricalCabinet;//整體動畫狀態及
[SerializeField] private GameObject obj_shanye;//扇葉物件
[SerializeField] private Camera thisCamera;//照射發電機控制櫃攝像機
[SerializeField] private GameObject[] obj_Btn_Second;//第二行按鈕(0:啟動,1:停機 2:緊急停機 3:維護 4:重啟 )
[SerializeField] private GameObject[] obj_Btn_Thrid;//第三行按鈕(0:右偏航 1:左偏航 2:開槳 3:閉槳)
[SerializeField] private GameObject obj_Overmaintenance;//結束維護物件
[SerializeField] private GameObject obj_zhangai;//維護物件前面障礙物件

    [Header("Bool")]
    [SerializeField] private bool _isQiDong;//是否開啟啟動
    [SerializeField] private bool _isTingJi;//是否開啟停機
    [SerializeField] private bool _isJinJi;//緊急停機
    [SerializeField] private bool _isguzhangliang;//是否開啟故障(維護)
    [SerializeField] private bool _isWeihu;//左右偏航開閉槳按鈕可以點選
    [SerializeField] private bool _isChongQi;//是否開啟重啟
    private bool _isStopMove;//風機是否停止運動
    private EnumManager.ElectricControllerButton thisMouseButtonDownButton;//滑鼠按鈕臨時物件
    void Start()
    {
        ani_ElectricalCabinet.SetTrigger("daiji");//待機燈亮
        _isQiDong = true;
        for (int i = 1; i < obj_Btn_Second.Length; i++)
        {
            obj_Btn_Second[i].GetComponent<BoxCollider>().enabled = false;//除啟動按鈕可以點選,其餘不可點選
        }
    }

    void Update()
    {
        if (true)
        {
            Ray ray = thisCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit rayHit;
            LayerMask layer = 1 << 17;//射線只打到第17層
            if (Physics.Raycast(ray, out rayHit, 1000, layer))
            {
                if (rayHit.collider.name == "weihujieshu")
                {
                    if (Input.GetMouseButtonDown(0))
                    {
                        _isguzhangliang = false;
                    }
                }
                if (Input.GetMouseButtonDown(0))
                {
                    thisMouseButtonDownButton = rayHit.transform.GetComponent<ElectricalCabinetControlGenerator_CabinetButtonManager>().GetButtonEnum();
                    OnClickEveryBodyButton(thisMouseButtonDownButton, true);
                    Debug.Log("滑鼠點選!!!");
                }
                if (Input.GetMouseButtonUp(0))
                {
                    OnClickEveryBodyButton(thisMouseButtonDownButton, false);//為假按鈕播放反動畫
                }
            }

            else
            {
                OnClickEveryBodyButton(EnumManager.ElectricControllerButton.NULL, true);
            }
            if (_isguzhangliang)
            {
                ShutdownMoveStop();

            }
        }
    }


    //待機燈滅
    IEnumerator StandBy()
    {
        yield return new WaitForSeconds(0.5f);
        ani_ElectricalCabinet.SetTrigger("fandaiji");

    }
    //停機緩慢停止
    public void ShutdownMoveStop()
    {
        float x = obj_shanye.GetComponent<MoveAndRotate>().rotateDegreesPerSecond.value.x;
        x -= 2 * Time.deltaTime;
        obj_shanye.GetComponent<MoveAndRotate>().rotateDegreesPerSecond.value.x = x;
        if (x < 0)
        {
            x = 0;
            obj_shanye.GetComponent<MoveAndRotate>().rotateDegreesPerSecond.value.x = x;
            obj_shanye.GetComponent<MoveAndRotate>().enabled = false;
            obj_zhangai.SetActive(false);
        }
    }

    //點選按鈕觸發
    public void OnClickEveryBodyButton(EnumManager.ElectricControllerButton thisButton, bool isBool)
    {
        switch (thisButton)
        {
            //啟動
            case EnumManager.ElectricControllerButton.Startup:
                if (_isQiDong)
                {
                    ani_ElectricalCabinet.SetTrigger("qidong");//按下啟動按鈕
                    StartCoroutine(StandBy()); //待機燈滅                 
                    ani_ElectricalCabinet.SetTrigger("yunxing");//執行燈亮
                    obj_shanye.GetComponent<MoveAndRotate>().enabled = true;//風扇轉動
                    obj_shanye.GetComponent<MoveAndRotate>().rotateDegreesPerSecond.value = new Vector3(10.0f, 0, 0);
                    obj_Btn_Second[0].GetComponent<BoxCollider>().enabled = false;//啟動按鈕不可以點選
                    obj_Btn_Second[1].GetComponent<BoxCollider>().enabled = true;//停機按鈕可以點選
                    obj_Btn_Second[2].GetComponent<BoxCollider>().enabled = true;//急停按鈕可以點選
                    _isTingJi = true;//停機開啟
                    _isJinJi = true;
                    _isQiDong = false;
                }
                break;
            //停機
            case EnumManager.ElectricControllerButton.Shutdown:
                if (_isTingJi)
                {
                    ani_ElectricalCabinet.SetTrigger("tingji");//按鈕停機按鈕
                    ani_ElectricalCabinet.SetTrigger("fanyunxing");//執行燈滅
                    ani_ElectricalCabinet.SetTrigger("guzhang");//故障燈亮
                    ani_ElectricalCabinet.SetBool("guzhangbool", false);//故障燈滅
                    obj_Btn_Second[2].GetComponent<BoxCollider>().enabled = false;//急停按鈕不可以點選     
                    obj_Btn_Second[3].GetComponent<BoxCollider>().enabled = true;//維護按鈕可以點選
                    _isguzhangliang = true;//開啟故障
                    _isJinJi = false;
                    _isTingJi = false;
                }

                break;
            //緊急停機
            case EnumManager.ElectricControllerButton.Emergencystop:
                if (_isJinJi)
                {
                    ani_ElectricalCabinet.SetTrigger("jinjiniu");//緊急按鈕
                    ani_ElectricalCabinet.SetTrigger("fanyunxing");//執行燈滅
                    ani_ElectricalCabinet.SetTrigger("guzhang");//故障燈亮
                    ani_ElectricalCabinet.SetBool("guzhangbool", false);//故障燈滅
                    obj_shanye.GetComponent<MoveAndRotate>().rotateDegreesPerSecond.value.x = 0;
                    obj_Btn_Second[1].GetComponent<BoxCollider>().enabled = false;//停機按鈕不可以點選
                    obj_Btn_Second[3].GetComponent<BoxCollider>().enabled = true;//維護按鈕可以點選
                    _isguzhangliang = true;//開啟故障
                    _isJinJi = false;
                    _isTingJi = false;
                }
                break;
            //維護
            case EnumManager.ElectricControllerButton.Maintain:
                //在故障情況下
                if (_isguzhangliang)
                {
                    _isWeihu = true;//左右偏航開閉槳按鈕可以點選                   
                    //ani_ElectricalCabinet.SetTrigger("guzhang");//故障燈亮
                    ani_ElectricalCabinet.SetTrigger("weihudeng");//維護燈亮
                    ani_ElectricalCabinet.SetTrigger("weihuniu");//維護按鈕
                    obj_Overmaintenance.SetActive(true);
                    obj_Btn_Second[3].GetComponent<BoxCollider>().enabled = false;//維護觸發器關閉
                    Debug.Log("故障燈亮");
                }
                else if (_isguzhangliang == false)
                {
                    ani_ElectricalCabinet.SetTrigger("fanweihuniu");//維護按鈕關閉
                    ani_ElectricalCabinet.SetTrigger("fanweihudeng");//維護燈滅
                    obj_Btn_Second[3].GetComponent<BoxCollider>().enabled = false;//維護觸發器開啟
                    obj_Btn_Second[4].GetComponent<BoxCollider>().enabled = true;//重啟按鈕可以點選
                    obj_Overmaintenance.SetActive(false);
                    _isChongQi = true;//重啟按鈕開啟
                    _isWeihu = false;//左右偏航開閉槳按鈕不可以點選                         
                }
                break;
            //重啟
            case EnumManager.ElectricControllerButton.Restart:
                if (_isChongQi)
                {
                    ani_ElectricalCabinet.SetTrigger("chongqi");//重啟按鈕
                    ani_ElectricalCabinet.SetTrigger("fanguzhang");//故障燈滅
                    ani_ElectricalCabinet.SetBool("guzhangbool", true);//故障燈滅
                    ani_ElectricalCabinet.SetTrigger("daiji");//待機燈亮
                    obj_Btn_Second[4].GetComponent<BoxCollider>().enabled = false;//重啟按鈕不可以點選
                    obj_Btn_Second[0].GetComponent<BoxCollider>().enabled = true;//啟動按鈕可以點選
                    _isQiDong = true;
                    Debug.Log("故障燈滅");
                }
                break;
            //左偏航
            case EnumManager.ElectricControllerButton.Leftyaw:
                if (_isWeihu && _isguzhangliang)
                {
                    if (isBool)
                    {
                        ani_ElectricalCabinet.SetTrigger("zuopianhang");//左偏航按鈕
                        OperationAndCommissioning_ButtonEvent._instance.MouseDownForwardYaw();
                    }
                    else
                    {
                        ani_ElectricalCabinet.SetTrigger("fanzuopianhang");//左偏航按鈕
                    }
                }
                break;
            //右偏航
            case EnumManager.ElectricControllerButton.Rightyaw:
                if (_isWeihu && _isguzhangliang)
                {
                    if (isBool)
                    {
                        OperationAndCommissioning_ButtonEvent._instance.MouseDownAdverseYaw();
                        ani_ElectricalCabinet.SetTrigger("youpianhang");//右偏航按鈕
                    }
                    else
                    {
                        ani_ElectricalCabinet.SetTrigger("fanyoupianhang");//右偏航按鈕
                    }
                }
                break;
            //開槳
            case EnumManager.ElectricControllerButton.Pulping:
                if (_isWeihu && _isguzhangliang)
                {
                    if (isBool)
                    {
                        OperationAndCommissioning_ButtonEvent._instance.MouseDownOpenFan();
                        ani_ElectricalCabinet.SetTrigger("kaijiang");//開槳按鈕
                    }
                    else
                    {
                        ani_ElectricalCabinet.SetTrigger("fankaijiang");//開槳按鈕
                    }
                }
                break;
            //閉槳
            case EnumManager.ElectricControllerButton.Closepulp:
                if (_isWeihu && _isguzhangliang)
                {
                    if (isBool)
                    {
                        OperationAndCommissioning_ButtonEvent._instance.MouseDownCloseFan();
                        ani_ElectricalCabinet.SetTrigger("guanjiang");//閉槳按鈕       
                    }
                    else
                    {
                        ani_ElectricalCabinet.SetTrigger("fanguanjiang");//閉槳按鈕       
                    }
                }
                break;
            case EnumManager.ElectricControllerButton.NULL:
                break;
            default:
                break;
        }
    }
}

}