533 lines
17 KiB
C#
533 lines
17 KiB
C#
using DefaultNamespace.ProcessMode;
|
|
using DG.Tweening;
|
|
using MotionFramework;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
/// <summary>
|
|
/// 螺丝刀
|
|
/// </summary>
|
|
public class Screwdriver : MonoBehaviour
|
|
{
|
|
/// <summary>
|
|
/// 螺丝刀坐标
|
|
/// </summary>
|
|
public Transform ScrewdriverTrans;
|
|
|
|
/// <summary>
|
|
/// 接线盒右边螺丝
|
|
/// </summary>
|
|
public GameObject ScrewR;
|
|
|
|
/// <summary>
|
|
/// 接线盒左边螺丝
|
|
/// </summary>
|
|
public GameObject ScrewL;
|
|
|
|
/// <summary>
|
|
/// 集中器左侧螺丝
|
|
/// </summary>
|
|
public GameObject LconcentratorScrew;
|
|
|
|
/// <summary>
|
|
/// 集中器右侧螺丝
|
|
/// </summary>
|
|
public GameObject RconcentratorScrew;
|
|
|
|
/// <summary>
|
|
/// 集线器外壳螺丝和封印
|
|
/// </summary>
|
|
public GameObject[] concentratorScrew;
|
|
|
|
/// <summary>
|
|
/// 旧集中器下端螺丝
|
|
/// </summary>
|
|
public GameObject[] ScrewObj;
|
|
|
|
/// <summary>
|
|
/// 集线盒电线动画
|
|
/// </summary>
|
|
public SkinnedMeshRenderer ElectricWireSMR;
|
|
|
|
/// <summary>
|
|
/// 电线碰撞
|
|
/// </summary>
|
|
public BoxCollider ElectricWireBcr;
|
|
|
|
/// <summary>
|
|
/// 集中器盖子
|
|
/// </summary>
|
|
public GameObject HubCoverObj;
|
|
|
|
/// <summary>
|
|
/// 集中器后边螺丝
|
|
/// </summary>
|
|
public GameObject[] ConcentratorScrewObj;
|
|
|
|
/// <summary>
|
|
/// 跟换下来的集中器
|
|
/// </summary>
|
|
public Transform ConcentratorObj;
|
|
|
|
/// <summary>
|
|
/// 电线前段胶带
|
|
/// </summary>
|
|
public Material TapeMar;
|
|
|
|
/// <summary>
|
|
/// 螺丝刀钳拧开开每个螺丝位置
|
|
/// </summary>
|
|
public Transform[] OpenScrewScrewdriverTrans;
|
|
|
|
public InteractiveObjects[] interactiveObjects;
|
|
|
|
/// <summary>
|
|
/// 拆完旧集中器下端螺丝后
|
|
/// </summary>
|
|
bool issplit =true;
|
|
|
|
/// <summary>
|
|
/// 螺丝刀的原始位置
|
|
/// </summary>
|
|
private Vector3 originalPosition;
|
|
|
|
/// <summary>
|
|
/// 螺丝刀的原始旋转
|
|
/// </summary>
|
|
private Quaternion originalRotation;
|
|
|
|
/// <summary>
|
|
/// 工具解绑的父物体
|
|
/// </summary>
|
|
public GameObject PlayerCamera;
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 初始化
|
|
/// </summary>
|
|
void Init()
|
|
{
|
|
ElectricWireBcr.enabled = false;
|
|
//ElectricWireSMR.SetBlendShapeWeight(0, 0);
|
|
//ElectricWireSMR.SetBlendShapeWeight(1, 0);
|
|
//ElectricWireSMR.SetBlendShapeWeight(2, 0);
|
|
//ElectricWireSMR.SetBlendShapeWeight(3, 0);
|
|
//ElectricWireSMR.SetBlendShapeWeight(4, 0);
|
|
ElectricWireSMR.SetBlendShapeWeight(5, 0);
|
|
TapeMar.SetFloat("_step_p1", 0);
|
|
TapeMar.SetFloat("_step_p2", 0);
|
|
TapeMar.SetFloat("_step_p3", 0);
|
|
TapeMar.SetFloat("_step_p4", 0);
|
|
TapeMar.SetFloat("_step_p5", 0);
|
|
TapeMar.SetFloat("_step_p6", 0);
|
|
//TapeMar.SetFloat("_step_p1", 1);
|
|
originalPosition = ScrewdriverTrans.transform.localPosition;
|
|
originalRotation = ScrewdriverTrans.transform.localRotation;
|
|
}
|
|
|
|
float weight;
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
if (Input.GetMouseButtonDown(0))
|
|
{//Camera.transform.forward
|
|
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
|
|
RaycastHit hit;
|
|
bool raycast = Physics.Raycast(ray, out hit);
|
|
if (raycast)
|
|
{
|
|
if (hit.collider.gameObject.name == "盖_固定螺丝_Rup")
|
|
{
|
|
ScrewdriverTrans.gameObject.transform.SetParent(null);
|
|
StartCoroutine(Rscrew());
|
|
Debug.Log(hit.collider.gameObject.name); MotionEngine.GetModule<AnimationProcessManager>().HandleClick(hit.collider.gameObject.name);
|
|
}
|
|
if (hit.collider.gameObject.name == "固定螺丝_Ldown")
|
|
{
|
|
ScrewdriverTrans.gameObject.transform.SetParent(null);
|
|
StartCoroutine(Lscrew());
|
|
Debug.Log(hit.collider.gameObject.name); MotionEngine.GetModule<AnimationProcessManager>().HandleClick(hit.collider.gameObject.name);
|
|
}
|
|
if (hit.collider.gameObject.name == "壳固定螺丝_R")
|
|
{
|
|
ScrewdriverTrans.gameObject.transform.SetParent(null);
|
|
Debug.Log(hit.collider.gameObject.name);
|
|
StartCoroutine(IERconcentratorScrew()); MotionEngine.GetModule<AnimationProcessManager>().HandleClick(hit.collider.gameObject.name);
|
|
}
|
|
if (hit.collider.gameObject.name == "壳固定螺丝_L")
|
|
{
|
|
ScrewdriverTrans.gameObject.transform.SetParent(null);
|
|
Debug.Log(hit.collider.gameObject.name);
|
|
StartCoroutine(IELconcentratorScrew()); MotionEngine.GetModule<AnimationProcessManager>().HandleClick(hit.collider.gameObject.name);
|
|
}
|
|
for (int i = 0; i < ScrewObj.Length; i++)
|
|
{
|
|
if (hit.collider.gameObject.name == ScrewObj[i].name)
|
|
{
|
|
ScrewdriverTrans.gameObject.transform.SetPositionAndRotation(OpenScrewScrewdriverTrans[4].gameObject.transform.position, OpenScrewScrewdriverTrans[4].gameObject.transform.rotation);
|
|
ScrewdriverTrans.gameObject.transform.SetParent(null);
|
|
Debug.Log(hit.collider.gameObject.name);
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
switch (hit.collider.gameObject.name)
|
|
{
|
|
case "JZQ_螺丝001":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝0011":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝002":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝0022":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝003":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝0033":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝004":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝0044":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝005":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
case "JZQ_螺丝006":
|
|
ScrewObj[i].gameObject.SetActive(false);
|
|
break;
|
|
}
|
|
MotionEngine.GetModule<AnimationProcessManager>().HandleClick(hit.collider.gameObject.name);
|
|
}
|
|
}
|
|
if (hit.collider.gameObject.name == "固定螺丝_Rdown")
|
|
{
|
|
|
|
ScrewdriverTrans.gameObject.transform.SetParent(null);
|
|
Debug.Log(hit.collider.gameObject.name);
|
|
StartCoroutine(right());
|
|
MotionEngine.GetModule<AnimationProcessManager>().HandleClick(hit.collider.gameObject.name);
|
|
}
|
|
if (hit.collider.gameObject.name == "集电器固定螺丝_Ldown")
|
|
{
|
|
ScrewdriverTrans.gameObject.transform.SetParent(null);
|
|
Debug.Log(hit.collider.gameObject.name);
|
|
StartCoroutine(left());
|
|
MotionEngine.GetModule<AnimationProcessManager>().HandleClick(hit.collider.gameObject.name);
|
|
|
|
}
|
|
}
|
|
}
|
|
chaiwan();
|
|
if (ConcentratorScrew())
|
|
{
|
|
StartCoroutine(IEConcentratorScrew());
|
|
}
|
|
//集中器螺丝全隐藏后播放电线动画
|
|
if (AreAllObjectsHidden()&& concentrator.isPlayAni)
|
|
{
|
|
StartCoroutine(ScrewdriverBack());
|
|
ElectricWireBcr.enabled = true;
|
|
//StartCoroutine(IEElectricWire());
|
|
// Debug.Log("所有螺丝都已隐藏");
|
|
}
|
|
//集中器外壳上的封印和螺丝
|
|
if (AllHubOfHubs())
|
|
{
|
|
HubCoverObj.gameObject.transform.DOLocalMove(new Vector3(0, 0.0167f, -0.2387f),1);
|
|
// Debug.Log("所有集线器盖子螺丝都已隐藏");
|
|
}
|
|
}
|
|
|
|
|
|
public void chaiwan()
|
|
{
|
|
if (!issplit)
|
|
{
|
|
//判断上下两颗螺丝是否全部取下
|
|
if (!ScrewObj[0].activeInHierarchy && !ScrewObj[1].activeInHierarchy)
|
|
{
|
|
StartCoroutine(Frist());
|
|
issplit = true;
|
|
}
|
|
if (!ScrewObj[2].activeInHierarchy && !ScrewObj[3].activeInHierarchy)
|
|
{
|
|
StartCoroutine(Second());
|
|
issplit = true;
|
|
}
|
|
if (!ScrewObj[4].activeInHierarchy && !ScrewObj[5].activeInHierarchy)
|
|
{
|
|
|
|
StartCoroutine(Thrid());
|
|
|
|
issplit = true;
|
|
}
|
|
if (!ScrewObj[6].activeInHierarchy && !ScrewObj[7].activeInHierarchy)
|
|
{
|
|
|
|
StartCoroutine(Fourth());
|
|
|
|
issplit = true;
|
|
}
|
|
if (!ScrewObj[9].activeInHierarchy)
|
|
{
|
|
|
|
|
|
StartCoroutine(Sixth());
|
|
issplit = true;
|
|
}
|
|
if (!ScrewObj[8].activeInHierarchy)
|
|
{
|
|
|
|
StartCoroutine(Fivth());
|
|
issplit = true;
|
|
}
|
|
}
|
|
|
|
}
|
|
/// <summary>
|
|
/// 判断集中器螺丝
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public bool AreAllObjectsHidden()
|
|
{
|
|
foreach (GameObject obj in ScrewObj)
|
|
{
|
|
if (obj.activeInHierarchy)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 判断集中器外壳上的封印和螺丝
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public bool AllHubOfHubs()
|
|
{
|
|
foreach (GameObject obj in concentratorScrew)
|
|
{
|
|
if (obj.activeInHierarchy)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 判断集中器后部四颗螺丝
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public bool ConcentratorScrew()
|
|
{
|
|
foreach (GameObject obj in ConcentratorScrewObj)
|
|
{
|
|
if (obj.activeInHierarchy)
|
|
{
|
|
issplit = false;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 螺丝刀返回动画
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator ScrewdriverBack()
|
|
{
|
|
ScrewdriverTrans.gameObject.transform.SetParent(PlayerCamera.transform);
|
|
yield return new WaitForSeconds(0.5f);
|
|
ScrewdriverTrans.gameObject.transform.localPosition = originalPosition;
|
|
ScrewdriverTrans.gameObject.transform.localRotation = originalRotation;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 接线盒右边螺丝
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator Rscrew()
|
|
{
|
|
//ScrewdriverTrans.transform.DOLocalRotate(new Vector3(-19.741f, -113.296f, 90), 0.5f);
|
|
//yield return new WaitForSeconds(0.6f);
|
|
//ScrewdriverTrans.transform.DOLocalMove(new Vector3(3.2373f, 1.8549f, -1.244f), 1f);
|
|
ScrewdriverTrans.transform.position = OpenScrewScrewdriverTrans[0].transform.position;
|
|
yield return new WaitForSeconds(1);
|
|
//ScrewdriverTrans.transform.DOLocalRotate(new Vector3(-19.741f, -113.296f, -104.747f), 1f);
|
|
//yield return new WaitForSeconds(1.2f);
|
|
//ScrewdriverTrans.transform.DOLocalMove(new Vector3(3.191f, 1.831f, -1.158f), 1f);
|
|
//yield return new WaitForSeconds(1.5f);
|
|
ScrewR.transform.DOLocalMove(new Vector3(0.1316f, 0.036f, 0.0034f), 1f);
|
|
yield return new WaitForSeconds(1.2f);
|
|
StartCoroutine(ScrewdriverBack());
|
|
ScrewR.gameObject.SetActive(false);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 接线盒左边螺丝
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator Lscrew()
|
|
{
|
|
//ScrewdriverTrans.transform.DOLocalMove(new Vector3(3.2373f, 1.8284f, -1.3885f), 0.5f);
|
|
//yield return new WaitForSeconds(0.6f);
|
|
//ScrewdriverTrans.transform.DOLocalRotate(new Vector3(-19.741f, -113.296f, -104.747f), 1f);
|
|
ScrewdriverTrans.transform.position = OpenScrewScrewdriverTrans[1].transform.position;
|
|
yield return new WaitForSeconds(1f);
|
|
//ScrewdriverTrans.transform.DOLocalRotate(new Vector3(-19.741f, -113.296f, 90), 1f);
|
|
//yield return new WaitForSeconds(1.5f);
|
|
ScrewL.transform.DOLocalMove(new Vector3(-0.07357633f, -0.01137948f, -0.0366f), 1f);
|
|
yield return new WaitForSeconds(1.2f);
|
|
StartCoroutine(ScrewdriverBack());
|
|
ScrewL.gameObject.SetActive(false);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 集中器右侧螺丝
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator IERconcentratorScrew()
|
|
{
|
|
ScrewdriverTrans.transform.position = OpenScrewScrewdriverTrans[2].transform.position;
|
|
yield return new WaitForSeconds(1.5f);
|
|
RconcentratorScrew.transform.DOLocalMove(new Vector3(0.1143f, 0.0216f, -0.1031f), 0.5f);
|
|
yield return new WaitForSeconds(1f);
|
|
StartCoroutine(ScrewdriverBack());
|
|
RconcentratorScrew.gameObject.SetActive(false);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 集中器左侧螺丝
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator IELconcentratorScrew()
|
|
{
|
|
//ScrewdriverTrans.transform.DOLocalMove(new Vector3(3.2669f, 2.0962f, -1.4616f), 1f);
|
|
//yield return new WaitForSeconds(1.5f);
|
|
//ScrewdriverTrans.transform.DOLocalRotate(new Vector3(-19.741f, -113.296f, -104.747f), 1f);
|
|
//yield return new WaitForSeconds(1.5f);
|
|
//ScrewdriverTrans.transform.DOLocalRotate(new Vector3(-19.741f, -113.296f, 90), 1f);
|
|
ScrewdriverTrans.transform.position = OpenScrewScrewdriverTrans[3].transform.position;
|
|
yield return new WaitForSeconds(1.5f);
|
|
LconcentratorScrew.transform.DOLocalMove(new Vector3(-0.1188f, 0.0216f, -0.1031f), 0.5f);
|
|
yield return new WaitForSeconds(1f);
|
|
StartCoroutine(ScrewdriverBack());
|
|
LconcentratorScrew.gameObject.SetActive(false);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 集线器螺丝拆完后电线动画
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator IEElectricWire(string name ,GameObject[] Screw)
|
|
{
|
|
for (int a = 0; a < Screw.Length; a++)
|
|
{
|
|
if (Screw[a].gameObject.activeInHierarchy)
|
|
{
|
|
for (int i = 0; i <= 100; i++)
|
|
{
|
|
yield return new WaitForSeconds(0.001f);
|
|
ElectricWireSMR.SetBlendShapeWeight(0, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
#region 电线动画
|
|
IEnumerator Frist()
|
|
{
|
|
//yield return new WaitForSeconds(1f);
|
|
for (int i = 0; i <= 100; i++)
|
|
{
|
|
yield return new WaitForSeconds(0.001f);
|
|
ElectricWireSMR.SetBlendShapeWeight(0, i);
|
|
}
|
|
}
|
|
IEnumerator Second()
|
|
{
|
|
for (int i = 0; i <= 100; i++)
|
|
{
|
|
yield return new WaitForSeconds(0.002f);
|
|
ElectricWireSMR.SetBlendShapeWeight(1, i);
|
|
}
|
|
}
|
|
IEnumerator Thrid()
|
|
{
|
|
for (int i = 0; i <= 100; i++)
|
|
{
|
|
yield return new WaitForSeconds(0.002f);
|
|
ElectricWireSMR.SetBlendShapeWeight(2, i);
|
|
}
|
|
}
|
|
IEnumerator Fourth()
|
|
{
|
|
for (int i = 0; i <= 100; i++)
|
|
{
|
|
yield return new WaitForSeconds(0.002f);
|
|
ElectricWireSMR.SetBlendShapeWeight(3, i);
|
|
}
|
|
}
|
|
IEnumerator Fivth()
|
|
{
|
|
for (int i = 0; i <= 100; i++)
|
|
{
|
|
yield return new WaitForSeconds(0.002f);
|
|
ElectricWireSMR.SetBlendShapeWeight(4, i);
|
|
}
|
|
}
|
|
IEnumerator Sixth()
|
|
{
|
|
for (int i = 0; i <= 100; i++)
|
|
{
|
|
yield return new WaitForSeconds(0.002f);
|
|
ElectricWireSMR.SetBlendShapeWeight(5, i);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
|
|
/// <summary>
|
|
/// 集中器背后螺丝全部拆完集中器动画
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator IEConcentratorScrew()
|
|
{
|
|
ConcentratorObj.gameObject.transform.DOLocalMove(new Vector3(-0.2719f, 2.24768f, -0.0772f), 0.5f);
|
|
yield return new WaitForSeconds(1f);
|
|
ConcentratorObj.gameObject.SetActive(false);
|
|
}
|
|
/// <summary>
|
|
/// 旧的集线器背后右边螺丝
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator right()
|
|
{
|
|
ScrewdriverTrans.transform.position = OpenScrewScrewdriverTrans[4].transform.position;
|
|
yield return new WaitForSeconds(0.5f);
|
|
ConcentratorScrewObj[0].SetActive(false);
|
|
ConcentratorScrewObj[1].SetActive(false);
|
|
}
|
|
IEnumerator left()
|
|
{
|
|
ScrewdriverTrans.transform.position = OpenScrewScrewdriverTrans[4].transform.position;
|
|
yield return new WaitForSeconds(0.5f);
|
|
ConcentratorScrewObj[2].SetActive(false);
|
|
ConcentratorScrewObj[3].SetActive(false);
|
|
}
|
|
}
|
|
|