第一个方法:
一共2个类
第一个类控制步数,还有高亮:
using UnityEngine;
using System.Collections;
using System;
public class WS_BGAnimCtrl : MonoBehaviour
{
public static WS_BGAnimCtrl instance;
public int step = 1;//第几步
public CustomArrays[] ObjArrays;//需要高亮的物体collider数组
// Use this for initialization
void Start()
{
instance = this;
}
// Update is called once per frame
void Update()
{
}
/// <summary>
/// 高亮 可以点击boxclider
/// </summary>
/// <param name="index"></param>
public void HighLight(int index)
{
for (int i = 0; i < ObjArrays[index].obj.Length; i++)
{
MeshCoilder_En(ObjArrays[index].obj[i], 10, true);
}
}
/// <summary>
/// 取消第几个模型的高亮 取消上面的boxclider的enable
/// </summary>
public void UnHighLight(int index)
{
for (int i = 0; i < ObjArrays[index].obj.Length; i++)
{
MeshCoilder_En(ObjArrays[index].obj[i], 0, false);
}
}
public void RayUI()
{
Vector3 mp = Input.mousePosition;
RaycastHit hitInfo;
Ray ray = Camera.main.ScreenPointToRay(new Vector3(mp.x, mp.y, 0f));
if (Physics.Raycast(ray.origin, ray.direction, out hitInfo))
{
print(hitInfo.collider.gameObject.transform.root.name.ToString());
if (hitInfo.collider.gameObject.transform.root.name == "UI Root")
print("");
}
}
/// <summary>
/// 模型高亮 控制boxcollider的开关
/// </summary>
/// <param name="go"></param>
/// <param name="laye"></param>
/// <param name="enable"></param>
public void MeshCoilder_En(GameObject go, int laye, bool enable)
{
go.layer = laye;
if (go.GetComponent<BoxCollider>())
{
go.GetComponent<BoxCollider>().enabled = enable;
}
foreach (Transform item in go.transform)
{
item.gameObject.layer = laye;
if (item.GetComponent<BoxCollider>())
{
item.GetComponent<BoxCollider>().enabled = enable;
}
MeshCoilder_En(item.gameObject, laye, enable);
}
}
}
///需要高亮的物体数组
[System.Serializable]
public class CustomArrays
{
public GameObject[] obj;
public GameObject this[int index]
{
get
{
return obj[index];
}
}
}
绑定在随便一个地方就行。
第二个类控制点击:
using UnityEngine;
using System.Collections;
public class WS_ModelClick : MonoBehaviour {
public Animation anim;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnMouseDown()
{
print("mousedown");
StartCoroutine("ChaiFen");
}
public IEnumerator ChaiFen()
{
print("tor start");
//取消高亮 取消boxcollider的显示
WS_BGAnimCtrl.instance.UnHighLight(WS_BGAnimCtrl.instance.step-1);
//播放动画
anim.Play("Take 00" + (WS_BGAnimCtrl.instance.step+1).ToString());
//等动画播放完毕
yield return new WaitForSeconds(anim["Take 00" + (WS_BGAnimCtrl.instance.step + 1).ToString()].length);
//高亮下一个 确定下一个Boxcollider的显示
WS_BGAnimCtrl.instance.step += 1;//动画前进一步
WS_BGAnimCtrl.instance.HighLight(WS_BGAnimCtrl.instance.step-1);
//for (int i = 0; i < up_BC.Length; i++)//
//{
// MeshCoilder_En(up_BC[i].gameObject, 0, false);
//}
//anim.Play("Take 00" + animName);
//yield return new WaitForSeconds(anim["Take 00" + animName].length);
//for (int i = 0; i < next_BC.Length; i++)
//{
// MeshCoilder_En(next_BC[i].gameObject, 10, true);
//}
//Text_tishi.text = tishi;
//print("tor end");
}
}
这个绑定在需要点击哪里才能播放动画的部件上,注意部件要有boxcollider。
上面的方法可以在一个部件有点击多次的情况下播放动画。
第二个方法(无法在一个部件有多次点击的情况下使用):
只有一个类,绑定在点击的部件上,部件带boxcollider。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
/// <summary>
/// ★★★拆卸装配的主要流程
/// </summary>
public class ModelClick : MonoBehaviour
{
public GameObject _FPS;
public Transform _Camera;
// BoxCollider bc;
[Tooltip("下一个物体的BoxCollider")]
public BoxCollider[] next_BC;
[Tooltip("上一个物体的BoxCollider")]
public BoxCollider[] up_BC;
private Text Text_tishi;
[Tooltip("下一步提示信息")]
public string tishi;
public string animName;
public Animation anim;
// Use this for initialization
void Start()
{
Text_tishi = GameObject.Find("TiShiText").GetComponent<Text>();
if (animName == "2")
{
//Text_tishi.text = "安装钻头连接件。";
//AudioControl.instance.PlayChaiXie(0);
}
// Time.timeScale = 10;
}
void Awake()
{
}
// Update is called once per frame
void Update()
{
}
void OnDisable()
{
}
void OnMouseDown()
{
print("mousedown");
StartCoroutine("ChaiFen");
}
IEnumerator ChaiFen()
{
print("tor start");
for (int i = 0; i < up_BC.Length; i++)
{
MeshCoilder_En(up_BC[i].gameObject, 0, false);
}
anim.Play("Take 00" + animName);
yield return new WaitForSeconds(anim["Take 00" + animName].length);
for (int i = 0; i < next_BC.Length; i++)
{
MeshCoilder_En(next_BC[i].gameObject, 10, true);
}
Text_tishi.text = tishi;
print("tor end");
}
/// <summary>
/// 播放动画之帧数控制
/// </summary>
/// <param name="aniName">clip名称</param>
/// <param name="start">开始帧数</param>
/// <param name="end">结束帧数</param>
/// <param name="all">总贞数</param>
/// <param name="speed">播放速度</param>
/// <returns></returns>
/// <summary>
/// 模型高亮
/// </summary>
/// <param name="go"></param>
/// <param name="laye"></param>
/// <param name="enable"></param>
public void MeshCoilder_En(GameObject go, int laye, bool enable)
{
go.layer = laye;
if (go.GetComponent<BoxCollider>())
{
go.GetComponent<BoxCollider>().enabled = enable;
}
foreach (Transform item in go.transform)
{
item.gameObject.layer = laye;
if (item.GetComponent<BoxCollider>())
{
item.GetComponent<BoxCollider>().enabled = enable;
}
MeshCoilder_En(item.gameObject, laye, enable);
}
}
}