工作需求,做个记录。
首先在场景中添加一个自拍相机,对着自己。再用脚控制本切换。
需要注意的是设置这个 Depth 的值尽量小一点,否则切换相机时会发生视角错乱。
然后设置一个RawImage用来显示截的图片。设置如下图:
再加一个切换相机的按钮,就不展示了,普通按钮就行。文章来源:https://www.toymoban.com/news/detail-503326.html
脚本:文章来源地址https://www.toymoban.com/news/detail-503326.html
/// <summary>
/// 拍照按钮
/// </summary>
private void OnPhotoHandler()
{
timer = 3;
isSelfie = false;
photoCamera = Camera.main;//主相机
//修正自拍相机的位置
selfieCamera.transform.position = new Vector3(selfieCamera.transform.position.x, selfieTarget.position.y + 1.8f, selfieCamera.transform.position.z);
StartCoroutine(nameof(TakePhoto));
}
/// <summary>
/// 切换相机(自拍)
/// </summary>
private void OnSwitchCamera()
{
isSelfie = !isSelfie;
timer = 3;
photoCamera = isSelfie ? selfieCamera : Camera.main;//主相机和自拍相机切换
StopCoroutine(nameof(TakePhoto));
StartCoroutine(nameof(TakePhoto));
}
/// <summary>
/// 屏幕截图
/// </summary>
/// <returns></returns>
public Texture2D ScreenShot(Camera camera, Rect rect)
{
RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 50);
camera.targetTexture = rt;
camera.Render();
RenderTexture.active = rt;
Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.ARGB32, false);
//颜色纹理格式,每个通道8位。
screenShot.ReadPixels(rect, 0, 0);//从屏幕读取像素到保存的纹理数据中。
screenShot.Apply();//实际上应用所有以前的SetPixel和SetPixels更改。
camera.targetTexture = null;
RenderTexture.active = null;
Destroy(rt);
byte[] bytes = screenShot.EncodeToJPG();//设置文件类型
string fileName = DateTime.Now.ToString("yyyyMMddhhmmss") + ".jpg";
GameLogger.Log(fileName);
//NativeGallery 是个小插件,本地保存用的,否则要根据设备的不同
//设置各种路径啥的很麻烦,这个很好用。
NativeGallery.SaveImageToGallery(bytes, "MetaApePicturs", fileName);
return screenShot;
}
/// <summary>
/// 拍照(调用的是这个方法)
/// </summary>
IEnumerator TakePhoto()
{
btn_Photo.interactable = false; //倒计时开始时关闭拍照按钮
btn_ReverseCamera.gameObject.SetActive(true); //切换相机按钮显示
//当时间大于零时 执行循环 时间到了 退出循环
do
{
//输出时间
txt_PhotoCD.text = timer.ToString();
//并通过协程隔一秒执行一次 累减时间
yield return new WaitForSeconds(1);
timer--;
}
while (timer > 0);
btn_ReverseCamera.gameObject.SetActive(false);//切换相机按钮关闭
int ratio = 1;
Rect rect = new Rect(0, 0, (int)Screen.width / ratio, (int)Screen.height / ratio);//图片大小取决于ratio的大小
rawImage.texture = ScreenShot(photoCamera, rect);//截图
rawImage.enabled = true;
rawImage.rectTransform.DOScale(0.8f, 2f).SetEase(Ease.Linear).OnComplete(() =>
{
rawImage.texture = null;
rawImage.enabled = false;
rawImage.rectTransform.DOScale(1f, 0.1f);
btn_Photo.interactable = true;
});
}
到了这里,关于Unity—屏幕截图(拍照和自拍功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!