一个通过点击物体部件顺序播放物体动画的方法。

24 篇文章 1 订阅
该博客介绍了在Unity3D中如何实现游戏对象的点击交互和动画控制。通过两个类`WS_BGAnimCtrl`和`WS_ModelClick`,实现了点击高亮物体、播放动画以及切换步骤的功能。`WS_BGAnimCtrl`用于控制物体的高亮状态和步数,而`WS_ModelClick`则处理点击事件,播放相应动画并更新高亮。此方法适用于需要多次点击同一物体的情况。
摘要由CSDN通过智能技术生成

第一个方法:

一共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);
        }
    }
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值