//轮转图效果↑

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

public class RotationChart2D : MonoBehaviour, IEndDragHandler, IDragHandler
{
string imageName;
public int n = 10;//个数
public Image prefab;//预制体
public float max = 1;//最大值
public float min = 0.5f;//最小值

public float spacing = 100;//UI之间单位是像素
public float cut = 10;//减速度
public ChangeOfOutfit player;
public CastingPanel casting;
float c;//周长
float r;//半径
float ang;//弧度
List<Image> list = new List<Image>();
List<Transform> sortList = new List<Transform>();
public GameObject rotationChart2D;
float moveAng = 0;//拖动的弧度
void Start()
{
rotationChart2D = GameObject.Find("RotationChart2D").gameObject;
casting= GameObject.Find("CastingPanel").GetComponent<CastingPanel>();
imageName = "Image/ima_";
player = GameObject.Find("Player").GetComponent<ChangeOfOutfit>();
Refresh(imageName,12);
}
public void Refresh(string name,int num)
{
n = num;
if (list != null)
{
list.Clear();
}
if (sortList != null)
{
sortList.Clear();
}
if (transform.childCount>0)
{
for (int i = transform.childCount-1; i >= 0; i--)
{
Destroy(transform.GetChild(i).gameObject);
}
}
imageName = name;
//周长=(宽+间距)*个数
c = (prefab.rectTransform.rect.width + spacing) * n;
//半径= 周长/2π
r = c / (2 * Mathf.PI);
ang = 2 * Mathf.PI / n;
Move();
}

public void Move()
{

for (int i = 0; i < n; i++)
{
//判断集合中有就不创建,没有在创建
if (list.Count <= i)
{
list.Add(Instantiate(prefab, transform));
list[i].transform.GetChild(0). GetComponent<Image>().sprite = Resources.Load<Sprite>(imageName + i);
sortList.Add(list[i].transform);
}
float x = Mathf.Sin(i * ang + moveAng) * r;
float z = Mathf.Cos(i * ang + moveAng) * r;
//通过z计算近大远小
//计算z
float p = (z + r) / (r + r);
//线性差值公式
float scale = (max - min) * p + min;
list[i].rectTransform.anchoredPosition = new Vector2(x, 0);
list[i].transform.localScale = Vector3.one * scale;
}
sortList.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;
}

});
for (int i = 0; i < sortList.Count; i++)
{
sortList[i].SetSiblingIndex(i);
}

}

public void OnDrag(PointerEventData eventData)
{
//每帧拖动的距离
float dis = eventData.delta.x;
//通过计算弧度距离
float dragAng = dis / r;
moveAng += dragAng;
Move();
}
public void OnEndDrag(PointerEventData eventData)
{
float speed = eventData.delta.x;
float time = Mathf.Abs(speed) / cut;
DOTween.To((a) =>
{
//通过距离计算弧度
float dragAng = a / r;
moveAng += dragAng;
Move();
}, speed, 0, time).OnComplete(() =>
{

Align(list.IndexOf(sortList[n - 1].GetComponent<Image>()));//找到正中间的图片ID
});
}
public void Align(int id)
{
//当前下标
int index = list.IndexOf(sortList[n - 1].GetComponent<Image>());
//指定下标与当前下标的问题
int sp = id - index;
//计算另一个旋转方向需要的间隔
int sp0 = n - Mathf.Abs(sp);
//一个方向是顺时针另一个方向是逆时针 所以一个是正另一个一定是负
sp0 = sp > 0 ? -sp0 : sp0;
//选择两个方向中间间隔较小的一方旋转
int end = Mathf.Abs(sp) < Mathf.Abs(sp0) ? sp : sp0;
//计算间隔的弧度
float spAng = end * ang;
//需要旋转的弧度=与中间偏差的弧度+间隔的弧度
float AlignAng = Mathf.Asin(sortList[n - 1].GetComponent<RectTransform>().anchoredPosition.x / r) + spAng;
//通过需要旋转的弧度计算需要旋转的距离
float Aligndis = AlignAng * r;
//通过需要旋转的距离计算旋转的时间
float time = Mathf.Abs(AlignAng) / cut;
DOTween.To((a) =>
{

moveAng = a;
Move();
}, moveAng, moveAng - AlignAng, time).OnComplete(() =>//此处是换装可无视
{
//找到中间对应的图片 ID
int num = list.IndexOf(sortList[sortList.Count - 1].GetComponent<Image>());

if (n==12)
{
player.games[0] = Resources.Load<GameObject>("PlayerPPP/Prefab/Tou_" +num);
casting.ChangeClothes(0,num);
}

if (n==4)
{

player.games[1] = Resources.Load<GameObject>("PlayerPPP/Prefab/YiFu_" + num);
casting.ChangeClothes(1, num);
}
if (n == 5)
{
player.games[2] = Resources.Load<GameObject>("PlayerPPP/Prefab/Tui_" + num);
casting.ChangeClothes(2, num);
}
});

}
}

2D轮转图选角色换衣服相关推荐

  1. Unity3d 游戏角色换装

    对于2D游戏来说,角色换装就是更换对应人物图片. 对于3D游戏,如果一个角色模型是一个整体,那么换装就是更换整个模型或者简单的,更换这个模型对应的Material. 如果换装之后人物角色的外形变了,例 ...

  2. 浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】

    无论是AAA级的主机游戏,还是层出不穷的移动端游戏,角色换装几乎都是必不可少的功能,有的甚至是核心功能,像暗黑3和魔兽世界的幻化系统(如图1).这个功能没什么新鲜点.网上关于Unity换装的文章不胜枚 ...

  3. PDPS软件:导出AutoCAD可编辑的2D布局图

    目录 概述 创建新仿真资源 JT格式2D布局图生成 导出2D布局图JT格式文件 JT格式文件转换为CAD格式文件 本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢迎 ...

  4. unity之游戏角色换装实现

    http://www.cnblogs.com/shamoyuu/p/6505561.html 一.换装原理 游戏角色换装分为以下几步: 1.替换蒙皮网格 2.刷新骨骼 3.替换材质 上面这种是比较简单 ...

  5. 使用阈值图修改角色脸部阴影

    大家好,我是阿赵. 之前介绍了通过修改模型顶点法线的方法,来解决角色模型脸部光影问题.这里再顺便介绍一下第二种方法,使用阈值图修改角色脸部阴影 一.角色脸部光影的问题 这个问题之前讨论过,由于角色脸部 ...

  6. R语言ggplot2可视化2d密度图:可视化二维密度图并将两个二维密度图重叠起来、Overlay two ggplot2 stat_density2d plots

    R语言ggplot2可视化2D密度图:可视化二维密度图并将两个二维密度图重叠起来.Overlay two ggplot2 stat_density2d plots 目录

  7. unity 角色换装

    unity角色换装的关键是更改角色部位上的物体的SkinnedMeshRenderer组件的属性: 更改mesh:mesh决定了部位的物体的外形,是主要的数据. 刷新骨骼:同一个部位下,不同的mesh ...

  8. photoshop---压缩图片大小/给人物换衣服

    压缩图片大小 作用:很多网站上传照片都要求图片大小在几百k以内 步骤:导出-web所用格式-jpeg-优化问价大小 给人物换衣服 快速选择 工具选择要替换的衣服-ctrl+j复制图层-将要换得图案拖进 ...

  9. R 多变量数据预处理_R语言数据可视化之数据分布图(直方图、密度曲线、箱线图、等高线、2D密度图)...

    作者:穆晨 来源:https://www.cnblogs.com/muchen/p/5310732.html 阅读目录 数据分布图简介 绘制基本直方图 基于分组的直方图 绘制密度曲线 绘制基本箱线图 ...

最新文章

  1. php 多维数组排序_已迁移
  2. 位运算,处理前台多选值
  3. oracle 跨服务器推送视图_oracle跨数据库视图
  4. Python——随机法(蒙特卡罗方法)计算圆周率
  5. Pixhawk代码分析-姿态解算篇B
  6. centos who命令 查看当前登录系统用户信息
  7. 转 php include
  8. 量化指标公式源码_通达信指标公式源码线上阴线指标公式
  9. 电话号码正则表达式 (包含电话号码 和 手机号码)
  10. 为什么把devc++上的程序发到qq_微信上能登陆QQ了!腾讯QQ小程序使用体验
  11. python游戏设计教程视频_零基础python教程-用Python设计你的第一个小游戏
  12. linux下mysql连接_Linux下MySQL C++连接操作
  13. 39. 确保判别式是纯函数
  14. 图像分割学习笔记_1(opencv自带meanshift分割例子)
  15. CSDN2021博客之星
  16. SPI通信协议_02
  17. C盘用户文件夹下的AppData文件夹里放的是什么?
  18. 817考研c语言程序设计,2018年沈阳航空航天大学计算机院817C程序设计考研核心题库...
  19. mc33063,mc34063发热问题
  20. ERROR 2000 (HY000): Unknown MySQL error

热门文章

  1. 考研英语 - word-list-22
  2. 埃拉托色尼筛选法 C++实现
  3. Maven构建docker镜像并打包推送到远程私有仓库
  4. 5.8G微米波雷达感应方案
  5. word怎么去除回车标记
  6. 基于微信云开发实现电影推荐小程序
  7. 阜和SAP FICO模块课程
  8. 2015年热门的国产开源软件TOP 50
  9. python实现扫码支付_python支付宝页面扫码支付
  10. 4.1 费马质数分解