TyeUnityToolsCS.cs
using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using FfmpegUnity;
using UnityEngine;
using UnityEngine.UI;
public class TyeUnityToolsCS : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
void yePlayerPoseAnimatiom()
{
if (null == eSeq)
{
eSeq = DOTween.Sequence();
eSeq.Append(eImgWhiteAni.DOFade(0.5f, 0.02f));
eSeq.Append(eImgWhiteAni.DOFade(0, 0.02f));
eSeq.Append(eImgWhiteAni.DOFade(0.5f, 0.02f));
eSeq.Append(eImgWhiteAni.DOFade(0, 0.02f));
eSeq.Append(eImgWhiteAni.DOFade(0.5f, 0.02f));
eSeq.SetAutoKill(false);
return;
}
eSeq.Restart();
}
// 解压Zip yeToUnZip
// 格式化:
public void yeF() {
string eStrTime = "32,42"; //"32,42", // "00:00:15.0",
string[] eArrStr = eStrTime.Split(',');
int eIntLS = int.Parse(eArrStr[0]);
int eM = eIntLS / 60;
int eS = eIntLS % 60;
string eStrM = string.Format("{0:D2}", eM);
string eStrS = string.Format("{0:D2}", eS);
eStrHighlightMomenStartTime = $"00:{eStrM}:{eStrS}.0";
eIntHighlightMomenDurationSec = int.Parse(eArrStr[1]) - int.Parse(eArrStr[0]);
}
// 播放音频:
[System.NonSerialized] public AudioSource eAudioSource;
public void yePlayMp3(string ePathToMp3)
{
try
{
AudioClip eClip = Resources.LoadAsync<AudioClip>(ePathToMp3).asset as AudioClip;
eAudioSource.clip = eClip;
eAudioSource.Stop();
eAudioSource.Play();
}
catch (Exception e)
{
Debug.Log($"---播放{ePathToMp3}音频,异常:{e}--");
}
}
public void yeSetVideoProgress(Slider eSlider = null)
{
//try
//{
// float eT = (float)(eMediaPlayer.Control.GetCurrentTime() / eMediaPlayer.Control.GetBufferedTimes().Duration);
// float eVal = Mathf.Clamp(eT, 0.0f, 1.0f);
// eSlider.value = float.IsNaN(eVal) ? 0f : eVal; // 【处理不是值的情况】
//}
//catch (Exception e)
//{
// Debug.Log($"--- 视频进度 异常:{e} --");
//}
}
//--- 7. 计算 时间:
public string yeGetTimeNow()
{
DateTime eNowTime = DateTime.Now.ToLocalTime();
string eStrTime = eNowTime.ToString("yyyy/MM/dd HH:mm:ss");
//Debug.Log($"---当前的时间:{eStrTime} --");
return eStrTime;
}
public int yeGetTimeDif(string eStrTimeLast = "2022/03/23 11:15:57")
{
DateTime eTimeNow = DateTime.Now;
TimeSpan eTimeSpan = eTimeNow.Subtract(DateTime.Parse(eStrTimeLast)).Duration();
//Debug.Log("---过了:" + eTimeSpan.Hours + "时" + eTimeSpan.Minutes + "分" + eTimeSpan.Seconds + "秒");
//string eStrDif = $"{eTimeSpan.Hours}_{eTimeSpan.Minutes}_{eTimeSpan.Seconds}";
//PlayerPrefs.SetInt("eKeySaveGameTime", eTimeDif);
//PlayerPrefs.Save();
//Debug.Log($"---累计:{eTimeSpan.TotalSeconds}秒--");
return (int)(eTimeSpan.TotalSeconds);
}
//--- 获取当前的帧图片:
public Texture2D yeGetVideoCurrentFrameImage(Image eImgShowTest = null)
{
//Texture2D eTexture2D = new Texture2D(1920, 1080);
//eTexture2D = eMediaPlayer.ExtractFrame(eTexture2D);
//if (null != eImgShowTest)
//{
// eImgShowTest.sprite = Sprite.Create(eTexture2D, new Rect(0, 0, eTexture2D.width, eTexture2D.height), Vector2.zero);
//}
保存:
eResourcesCS.yeSaveImgToLocally(eTexture2D, ePathSave + $"{yeGetVideoCurrentTimeFrames()}.png");
//return eTexture2D;
return null;
}
///-- 图片帧动画: 通用 (Unity 原生的播不了gif动画,要转成图片播)
public IEnumerator yeAnimatiomForImagesFrame(Image eImg, List<Sprite> eListSprites, float eTime = 0.03f, int eIndex = 0)
{
eImg.gameObject.SetActive(true);
while (true)
{
if (eIndex > eListSprites.Count - 1)
{
eImg.gameObject.SetActive(false);
break;
//重复播放后面的部分: index: 用来控制起始播放的动画帧索引;
//index = 15;
}
eImg.sprite = eListSprites[eIndex];
eIndex++;
yield return new WaitForSeconds(eTime);//等待间隔, 控制动画播放速度;
}
}
///-- 改变 图片的 像素点:
public static void yeDrawOnRawImage(RawImage eRawImg)
{ //Graphics.DrawTexture(), Texture2D.SetPixels(), Texture2D.Apply();
try {
Texture eT = eRawImg.texture;
Texture2D eT2D = eT as Texture2D;
for (int i = 0; i < eT2D.width * 0.5f; i++){
for (int j = 0; j < eT2D.height * 0.5f; j++){
eT2D.SetPixel(i, j, UnityEngine.Color.red);
}
}
eT2D.Apply();
}
catch (Exception e){
Debug.Log($"---yeDrawOnRawImage 异常:{e}--");
}
}
//--- 视频裁剪: 插件 FfmpegUnity using FfmpegUnity;
public void yeVideoTrim(FfmpegCommand eFfmpegCommand, string ePathVideo, string ePathVideoSave, string eStrFromTime = "00:00:15.0", int eDurationSec = 15)
{ /// -y -i .../input.mp4 -ss 00:00:50.0 -codec copy -t 20 .../output.mp4
//FfmpegCommand eFfmpegCommand = new FfmpegCommand();
//eFfmpegCommand.ExecuteOnStart = false;
//eFfmpegCommand.Options = $"-y -i '/Users/edy/Desktop/0407/Test.mp4' -ss 00:00:15.0 -codec copy -t 15 '/Users/edy/Desktop/0407/Test5.mp4'";
eFfmpegCommand.StopFfmpeg(); // 须 先停止 可能还在进行的命令, 再去执行新的命令;
eFfmpegCommand.Options = $"-y -i '{ePathVideo}' -ss {eStrFromTime} -codec copy -t {eDurationSec} '{ePathVideoSave}'";
eFfmpegCommand.StartFfmpeg();
}
///-- 5.3 动画状态机: (做成预制体:不能通用)
public IEnumerator yeAnimatiomKeyFrame()
{
//AnimationClip oldClip = activeAnimationClip;
//activeAnimationClip = CopyAnimationClipAsset(activeAnimationClip);
//animationWindowReflect.activeAnimationClip = activeAnimationClip;
//animationWindowReflect.currentTime = currentTime;
yield return null;
}
///-- 5.4 特效: 粒子系统:
public IEnumerator yeAnimatiomForParticleSystem()
{
yield return null;
}
///-- 5.5 特效: Shader
public IEnumerator yeAnimatiomForShader()
{
yield return null;
}
///-- 5.6 跑马灯效果: (逐渐消失) using DG.Tweening;
public void yeAni(Image eImg, Image eImg2)
{
//eImg.DOFillAmount(0, 5).SetEase(Ease.Linear);
eImg2.DOFillAmount(1, 5).SetEase(Ease.Linear);
}
public void yePoseMoveAnimatiom(Image eImg, float eDuration = 1.5f, float eX = -1000.0f)
{
Debug.Log($"--- 动画 Move --");
eImg.transform.DOLocalMoveX(eX, eDuration, true)
.SetEase(Ease.InOutQuint)
.OnComplete(yePoseMoveAnimatiomComplete);
}
public void yePoseMoveAnimatiomComplete()
{
Debug.Log($"--- 动画 Ok --");
//eTweenerMove.Rewind();
//eTweenerMove.onUpdate();
//eTweenerMove.onComplete();
//eImgPoseMove.gameObject.SetActive(false);
//eImgPoseMove.DOFade(0, 0.5f);
// 姿态 目标 图片:
//StartCoroutine(eResourcesCS.yeGetImageFromPath($"{eImgIndex}T", eImgPoseTarget)); // TODO:名称 标识;
//eImgPoseTarget.DOFade(1, 0.5f);
//eImgPoseTarget.gameObject.SetActive(true); // 直接在这设置会闪白(可加动画掩盖);
// 姿态 动画 图片:
//StartCoroutine(eResourcesCS.yeGetImageFromPath($"{eImgIndex}", eImgPoseMove));
//eImgPoseMove.gameObject.SetActive(true);
//eTweenerMove.Restart();
}
void yeInitAnimatiomMove()
{
DOTween.SetTweensCapacity(2, 3);
}
void yeCreateAnimatiomMove(float eX = -1000.0f)
{
//eImgBG.sprite = Sprite.Create(eTexture, new Rect(0, 0, eTexture.width, eTexture.height), Vector2.zero);
//Tweener eMoveTweener = eTransformMove.DOMove(new Vector3(500, 0, 0), 2.5f)
// .SetEase(Ease.InOutQuart)
// .OnComplete(yeAnimatiomOnComplete);
//eMoveTweener.Pause(); //设置暂停
//eTweenerMove = eImgPoseMove.transform.DOLocalMoveX(eX, ePoseMoveAniTime, true)
// .SetEase(Ease.InOutQuint)
// .OnComplete(yeAnimatiomMoveComplete);
//eTweenerMove.SetAutoKill(false); //取消自动销毁
}
void yeAnimatiomMoveComplete()
{
//isAniMoveComplete = true;
//eImgPoseMove.gameObject.SetActive(false);
//eImgPoseTarget.DOFade(0, 0.5f);
}
//---3. 姿态图片动画:
public Sequence yeInitPoseAnimatiom(Image eImg)
{
Sequence eSeq = DOTween.Sequence();
eSeq.Append(eImg.DOFade(1, 0.05f));
eSeq.Append(eImg.DOFade(0, 0.05f));
eSeq.Append(eImg.DOFade(1, 0.05f));
eSeq.SetAutoKill(false);
return eSeq;
}
//---2. 播放视频:
/ 外部调用 播放视频:
//public void yeVideoStart(string ePathVideo, bool isLoop = false)
//{
// Debug.Log($"--- 播放视频 开始 --");
// eMediaPlayer.Stop();
// eMediaPlayer.OpenMedia(MediaPathType.RelativeToPersistentDataFolder, ePathVideo, true);
// eMediaPlayer.Events.AddListener(yeVideoPlayerEvents);
// eMediaPlayer.Loop = isLoop;
//}
//void yeVideoPlayerEvents(MediaPlayer mp, MediaPlayerEvent.EventType mediaPlayerEvent, ErrorCode errorCode)
//{
// switch (mediaPlayerEvent)
// {
// case MediaPlayerEvent.EventType.MetaDataReady:
// break;
// case MediaPlayerEvent.EventType.ReadyToPlay:
// break;
// case MediaPlayerEvent.EventType.Started:
// break;
// case MediaPlayerEvent.EventType.FirstFrameReady://只有播放器为非循环模式时这个条件才会调用
// break;
// case MediaPlayerEvent.EventType.FinishedPlaying:
// //Control.Instance.PlayBack();
// yeVideoPlayerComplete();
// break;
// case MediaPlayerEvent.EventType.Closing:
// break;
// case MediaPlayerEvent.EventType.Error:
// break;
// case MediaPlayerEvent.EventType.SubtitleChange:
// break;
// case MediaPlayerEvent.EventType.Stalled:
// break;
// case MediaPlayerEvent.EventType.Unstalled:
// break;
// case MediaPlayerEvent.EventType.ResolutionChanged:
// break;
// case MediaPlayerEvent.EventType.StartedSeeking:
// break;
// case MediaPlayerEvent.EventType.FinishedSeeking:
// break;
// case MediaPlayerEvent.EventType.StartedBuffering:
// break;
// case MediaPlayerEvent.EventType.FinishedBuffering:
// break;
// case MediaPlayerEvent.EventType.PropertiesChanged:
// break;
// case MediaPlayerEvent.EventType.PlaylistItemChanged:
// break;
// case MediaPlayerEvent.EventType.PlaylistFinished:
// break;
// default:
// break;
// }
//}
--- 8. 视频录制: AVPro Movie Capture 支持平台:ios,macos,Windows(2022.7.22发布最新5.0版本 已经支持安卓)Android
NatCorder , AVCapture 插件 : 用FromScreen, 不要用FromCamera (画面会闪, 目前没有去看原因)
//public void yeVideoRecordToCam(CaptureFromTexture eCaptureCam, string ePathSave, Texture eTexture)
//{
// eCaptureCam.SetSourceTexture(eTexture);
// //eCaptureCam.UpdateSourceTexture();
// yeVideoRecordStart(eCaptureCam, ePathSave, true);
//}
ScreenCapture , TextureCapture
//public void yeVideoRecordStart(CaptureBase eCapture, string ePathSave, bool isCam = false)
//{
// eCapture.AppendFilenameTimestamp = false; //是否加时间戳
// eCapture.FilenameExtension = "mp4"; //视频名称后缀
// eCapture.OutputFolderPath = ePathSave; //视频保存路径
// //eCapture._autoGenerateFilename = false;
// //eCapture._codecName = "Media Foundation H.264(MP4)"; //视频格式
// //eCapture._useMediaFoundationH264 = true;
// //eCapture._forceFilename = "CaptureVideo.mp4";
// if (!isCam)
// {
// //eCapture.ResolutionDownscaleCustom = new Vector2(640, 360);
// eCapture.ResolutionDownScale = CaptureBase.DownScale.Half;
// }
// //开始拍摄功能
// eCapture.StartCapture();
// //yield return null;
//}
//public void yeVideoRecordStop(CaptureBase eCapture)
//{
// eCapture.StopCapture();
//}
//public void yeVideoRecordCancel(CaptureBase eCapture)
//{
// eCapture.CancelCapture();
//}
//public void yeVideoTrim(FfmpegCommand eFfmpegCommand, string ePathVideo, string ePathVideoSave, string eStrFromTime = "00:00:15.0", int eDurationSec = 15)
//{
// eFfmpegCommand.StopFfmpeg();
// eFfmpegCommand.Options = $"-y -i '{ePathVideo}' -ss {eStrFromTime} -codec copy -t {eDurationSec} '{ePathVideoSave}'";
// eFfmpegCommand.StartFfmpeg();
//}
}