Unity记录——ITween、Dotween实现开关门、判断在门前门后、批量处理单开、双开门以及推拉门

一、ITween方法实现

using JetBrains.Annotations;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using static iTween;

public enum DoorType
{
    ROTATE = 0,  //旋转门
    MOVE = 1,    //推拉门
}

public class MoveAndRotateController : MonoBehaviour
{

    //设置临时值用于存储初始位置
    Vector3 origPosition = Vector3.zero;

    [Header("门类型")]
    public DoorType doorType;
    [Header("公共属性")]
    public Transform Agent;
    Vector3 Temp;
    public float time;
    public float delayTime;
    public iTween.EaseType easeType;
    public iTween.LoopType loopType;
    //门是否已开
    public bool isOpen = false;
    //动画是否正在播放
    public bool isEnd = true;

    private void Start()
    {
        _isLock = false;
        switch (doorType) 
        {
            case DoorType.ROTATE:
            Temp = transform.eulerAngles;
                break;
            case DoorType.MOVE:
            Temp = transform.position;
                break;
        }

    }
    //public Transform Player;

    public void OpenDoor()
    {
        if (!isOpen && isEnd)
        {
            switch (doorType)
            {
                case DoorType.ROTATE:
                    //旋转门开门

                    RotateTo(Agent.eulerAngles, time, delayTime, easeType, loopType);

                    break;
                case DoorType.MOVE:
                    //移动门开门

                    MoveTo(Agent.position, time, delayTime, easeType, loopType);
                    break;
            }
            isOpen = true;
        }
        else
        {
            switch (doorType)
            {
                case DoorType.ROTATE:
                    //旋转门关门
                    RotateTo(Temp, time, delayTime, easeType, loopType);
                    break;
                case DoorType.MOVE:
                    //移动门关门
                    MoveTo(Temp, time, delayTime, easeType, loopType);
                    break;
            }

            isOpen = false;
        }
    }


    //添加移动
    public void MoveTo(Vector3 vec, float time, float delayTime, iTween.EaseType easetype, iTween.LoopType looptype)
    {
        iTween.MoveTo(gameObject, iTween.Hash("position", vec,
                                               "time", time,
                                               "delay", delayTime,
                                               "easetype", easetype,
                                               "looptype", looptype,
                                               "onstart", "StartTarget",
                                               "oncomplete", "CompleteTarget"
                                               ));
    }
    //添加旋转角
    public void RotateTo(Vector3 vec, float time, float delayTime, iTween.EaseType easetype, iTween.LoopType looptype)
    {
        iTween.RotateTo(gameObject, iTween.Hash("rotation", vec,
              "time", time,
              "delay", delayTime,
              "easetype", easetype,
              "looptype", looptype,
              "onstart", "StartTarget",
              "oncomplete", "CompleteTarget"
              ));
    }

    //开始播放动画
    public void StartTarget()
    {
        isEnd = false;
    }

    //动画播放结束
    public void CompleteTarget()
    {
        isEnd = true;
    }

    / <summary>
    / 判断玩家在物体的哪一面,正面返回true,背面返回false
    / </summary>
    / <returns></returns>
    //public bool PlayerPosition()
    //{
    //    float val = Vector3.Dot(transform.position - Player.position, transform.position - new Vector3(transform.position.x, transform.position.y, 1));
    //    //if (val <= 0)
    //    //{
    //    //    print("在门后");
    //    //}
    //    //else 
    //    //{
    //    //    print("在门前");
    //    //}
    //    bool isFront = val <= 0 ? false : true;
    //    return isFront;
    //    //Debug.DrawLine(new Vector3(transform.position.x,transform.position.y,1), transform.transform.position,Color.red);
    //    //Debug.DrawLine(Player.position, transform.transform.position,Color.blue);
    //}

}

 

 门把手旋转

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class RotateHandle : MonoBehaviour
{
    //设置临时值用于存储初始位置
    public Vector3 Vec;
    [Header("公共属性")]
    public float time;
    public float delayTime;
    public iTween.EaseType easeType;
    public iTween.LoopType loopType;

    bool _isLock = false;

    private void Start()
    {
        _isLock = false;
    }
    //把手
    public void Handle()
    {
        if (!_isLock) 
        {
            _isLock = true;
            RotateAdd(Vec, time, 0, easeType, loopType);
            RotateAdd(-Vec, time, 0.3f, easeType, loopType);
            StartCoroutine(IsLock());
        }
    }

    IEnumerator IsLock() 
    {
        yield return new WaitForSeconds(2 * time + 0.3f);
        _isLock = false;
    }
    //添加旋转角
    public void RotateAdd(Vector3 vec, float time, float delayTime, iTween.EaseType easetype, iTween.LoopType looptype)
    {
        iTween.RotateAdd(gameObject, iTween.Hash("amount", vec,
              "time", time,
              "delay", delayTime,
              "easetype", easetype,
              "looptype", looptype,
              "islocal", true
              ));
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

[RequireComponent(typeof(EventTrigger))]
[RequireComponent(typeof(MoveAndRotateController))]
public class DoorUser : MonoBehaviour
{
    EventTrigger eventTrigger;

    public MoveAndRotateController[] Door, Handle = null;

    private void Awake()
    {
        eventTrigger = GetComponent<EventTrigger>();
        AddPointerEvent(eventTrigger, EventTriggerType.PointerEnter, PointerEnter);
        AddPointerEvent(eventTrigger, EventTriggerType.PointerClick, PointerClick);
        AddPointerEvent(eventTrigger, EventTriggerType.PointerExit, PointerExit);
    }

    private void PointerClick(BaseEventData arg0)
    {
        print("Click");
        for (int i = 0; i < Door.Length; i++)
        {
            Door[i].OpenDoor();
            if (Handle.Length != 0)
                Handle[i].Handle();
        }

    }
    private void PointerExit(BaseEventData arg0)
    {
        
    }

    private void PointerEnter(BaseEventData arg0)
    {

    }

    //添加事件方法
    void AddPointerEvent(EventTrigger eventTrigger, EventTriggerType eventTriggerType, UnityEngine.Events.UnityAction<BaseEventData> callback)
    {
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = eventTriggerType;
        entry.callback = new EventTrigger.TriggerEvent();
        entry.callback.AddListener(callback);
        eventTrigger.triggers.Add(entry);
    }
}

 

 实现原理:

1、DoorDraft向着Target的欧拉角y轴值旋转,并记录原始值。再次触发则返回原始欧拉角。(移动门同理)

2、如果有门把手需要做旋转,则也需要给门把手添加MoveAndRotateController.cs脚本,并把把手的Obj加入到DoorUser.cs脚本的Handle数组

 3、如果是双开门,则给两个门,两个门把手都添加MoveAndRotateController.cs脚本,并给到Door和Handle数组                                                  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值