简单实现一下原神中的圣遗物界面轮转效果(包括3d人物显示在图片上)

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class RotatoinChart2 : MonoBehaviour,IDragHandler
{
public int num;
public Image prefab,player;
public float spacing = 200;
public float max = 1f;
public float min = 0.5f;
public float cutSpeed = 10;
float c;
float r;
float ang;
float dis;
List<GameObject> list = new List<GameObject>();
List<Transform> sorts = new List<Transform>();
// Start is called before the first frame update
void Start()
{
c = (spacing + prefab.rectTransform.rect.width) * num;
r = c / (Mathf.PI * 2);
ang = Mathf.PI * 2 / num;
Turn();
}
public void Turn()
{
float moveAng = dis / r;

for (int i = 0; i < num; i++)
{
if(list.Count <= i)
{
GameObject g = Instantiate(prefab.gameObject, transform);

list.Add(g);
sorts.Add(list[i].transform);
}
float x = Mathf.Sin(ang * i + moveAng) * r;
float z = Mathf.Cos(ang * i + moveAng) * r;
list[i].transform.localPosition = new Vector3(x, i*2, 0);
float p = (z + r) / (r + r);
float scale = (max - min) * p + min;
list[i].transform.localScale = Vector3.one * scale;
}
sorts.Sort((a, b) =>
{
if (a.localScale.x > b.localScale.x)
{
return 1;
}
else if (a.localScale.x == b.localScale.x)
{
return 0;
}
else
{
return -1;
}
});
//下面一行代码可以实行效果,但是有bug 因为该方法在onDrag的时候调用,所以会导致玩家这张图片一直被插入集合
//使集合的长度不断增加,最后前面覆盖后面,看到一种人物在最前面的状态(所以该方法不可取)
//sorts.Insert((sorts.Count - 1) / 2, player.transform);
//将图片按从小到大一次排序
for (int i = 0; i < sorts.Count; i++)
{
sorts[i].SetSiblingIndex(i);
}
player.transform.SetSiblingIndex((sorts.Count - 1) / 2);


}
public void OnDrag(PointerEventData eventData)
{
//拖动的距离 = 拖动距离+event.delta.x;
dis += eventData.delta.x;
//调用move
Turn();
}
}

//==============================3D模型显示在图片上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 这个脚本要挂载在image上
/// </summary>
public class LookPlayer : MonoBehaviour
{
//要印在图片上的对象
public GameObject player;
//相机下面用
Camera camera;
// Start is called before the first frame update
void Start()
{
//创建一个空对象叫cam
GameObject cam = new GameObject("cam");
//给空对象添加相机组件
camera = cam.AddComponent<Camera>();
//相机模式调为纯色
camera.clearFlags = CameraClearFlags.Color;
//调整相机的位置
camera.transform.position = player.transform.position + player.transform.forward*1.2f +Vector3.up*0.8f;
//lookAt调整相机的角度(看向玩家)
camera.transform.LookAt(player.transform.position+Vector3.up*0.5f );
//创建renderTexture
RenderTexture texture = new RenderTexture(1920, 1920, 0);
//将创建的RenderTexture赋值给相机的目标图片
camera.targetTexture = texture;
//创建一个材质球
Material material = new Material(Shader.Find("UI/Default"));
//给材质球贴图
material.mainTexture = texture;
//用材质球给image赋值
GetComponent<Image>().material = material;
}

// Update is called once per frame
void Update()
{

}
}

posted @ 2023-02-03 14:55  old_Host  阅读(57)  评论(0编辑  收藏  举报