【Unity开发】Unity实现英雄联盟选择皮肤效果

2023-11-11

using UnityEngine;
using System.Collections;
/// <summary>
/// 脚本位置:Card预制体身上
/// 脚本功能:保存Card所有数据信息,用于更换图片
/// </summary>
public class CardInfo : MonoBehaviour {
	// 保存3张图片的深度信息
	// 背景图片-》toggle激活图片-》人物图片
	public UIWidget [] widgets;

	// 用于控制图片的切换
	public UITexture cardTexture;

	// 当TweenPosition动画播放完成的时候
	// 执行该方法
	public void OnTweenPositionFinish()
	{
		// 获取自身当前的tween动画
		TweenPosition tp = GetComponent<TweenPosition>();
		// 设置动画的起点
		tp.from = gameObject.transform.localPosition;
		// 将动画重置成开始状态
		tp.ResetToBeginning();
	}


	

}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 脚本位置:UI Root
/// 脚本功能:生成预制体,改变预制体图片
/// </summary>
public class SelectCard : MonoBehaviour {
	// 所有卡牌的父物体
	public GameObject cardManager;
	// 中间卡牌的下标索引
	private int centerCardIndex = 0;
	private int moveX = 180;
	private int moveY = 40;
	// 每张card上需要调整depth的组件数量
	private int componetCount = 3;
	// 用于更换card图片的texture数组
	private Texture[] cardTexture;
	private List<CardInfo> cardInfoList = new List<CardInfo> ();

	void Start () {
		// 加载图片数组 
		cardTexture = Resources.LoadAll<Texture>("Pictures");
		// 最大索引
		int maxIndex  = cardTexture.Length / 2 + 1;
		// 中间卡牌数索引 (比如8张图,中间1张,左右一个4张,一个3张)  
        // 所以这个单边卡牌的索引就是4+1 = 5
		centerCardIndex = maxIndex;

		// 根据图片数组长度生成Card模板预制体
		// 遍历Resources加载到的所有图片 
		for (int i = 0; i < cardTexture.Length; i++) {
			// 加载人物卡牌图片预设体(注意不能加载到UIRoot的外面,那样会自动创建多个UICamera)
			GameObject goCardPrefab = Instantiate(Resources.Load<GameObject>("Card"));

			// 设置card的父物体
			goCardPrefab.transform.parent = cardManager.transform;

			// 设置card的大小
			goCardPrefab.transform.localScale = Vector3.one;

			// 给toggle添加监听事件
			EventDelegate.Add(goCardPrefab.GetComponent<UIToggle>().onChange,OnToggleValueChange);

			// item就是一个保存人物卡片上三张图片深度数据的类脚本 
			CardInfo item = goCardPrefab.GetComponent<CardInfo>();

			// 获取生成的预制体卡牌的一个texture属性,赋值为当前自己所在的预制体身上的图片   
            // 注意:赋值之前,要保证这个mainTexture原本就是有图的   
			item.cardTexture.mainTexture = cardTexture[i];

			// 设置人物卡牌的命名排序规则  
            // 当前生成的预制体名字为默认 最大索引 既 居中那张的数字  
            // 默认加载的第0张图片是居中的,加载顺序与文件夹中图片的顺序无关  
			goCardPrefab.name = maxIndex.ToString();
			// 判断生成物体的编号
			if (i > 0) {
				// 奇数设置为右边,下标为正数  
				if (i % 2 == 1) {
					maxIndex--;
					goCardPrefab.name = maxIndex.ToString();

				} 
				// 偶数设置为左边,下标为负数 
				else {	
					// 这里深度不需要再减的原因是已经在奇数位减过了  
                    // 比如9张牌,居中为5,先奇数减一变成4,那么下一次就是偶数,应该是-4了  
					goCardPrefab.name = "-" + maxIndex.ToString();
				}
			}
			// 初始化人物卡牌的位置   
            // 调用设置人物卡牌的深度以及位置  
			SetPositionAndDepth(item, 0, 0);
			cardInfoList.Add(item);
		}
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	// direction表示移动方向
	// 1:左移   -1:右移  0:初始化(不移动)
	void SetPositionAndDepth(CardInfo cardInfo, int direction, int nextIndex)

	{
		int nameIndex = 0;
		if (direction == 0) {
			nameIndex = int.Parse(cardInfo.name);
		}
		// 左右移动后,重新排序命名  
        // 第一次初始化的时候并不调用 
		if (direction != 0) {
			// nameIndex通过当前名字转换过来的  
            // 最中间位置的编号变化,右移:原-4变5;左移:原5变-4  
            // 正常情况下,左移,所有数都会+1  
            // 但中间那张牌不是,需要减一,再乘一个负数  
			if (nextIndex * direction > centerCardIndex) {
				nameIndex = -direction * (centerCardIndex - 1);
			} else {
                // index=0既,左面的-1要到右面变为+1 或者右面的 +1 要移动到左面变成-1
                // 但是这个需要一个判断,判断一共有多少张卡牌,如果是偶数的情况下,好吧,你画张图就知道了~
				if (nextIndex == 0) {
					nameIndex = cardInfoList.Count % 2 == 1 ? direction : direction * 2;
				} else {
                    // 移动后,索引变成nextIndex,符合条件,可以赋值
					nameIndex = nextIndex;
				}
			}
			// 发生了移动,改变了索引,需要更改名字
			cardInfo.name = nameIndex.ToString();
		}

		// 获取当前卡牌的tween组件,设置to坐标
		TweenPosition tp = cardInfo.GetComponent<TweenPosition>();
		// 根据当前卡牌名字的正负,来判断是左移还是右移
		int x = nameIndex > 0 ? (centerCardIndex - nameIndex) * moveX :-(centerCardIndex + nameIndex) * moveX;
		// 因为Y值都是向上,所以需要一个正数判断Y的位移
		nameIndex = Mathf.Abs(nameIndex);
		tp.to = new Vector3(x,(centerCardIndex - nameIndex) * moveY, 0);

		// 设置当前移动卡牌的3张图片的深度
		for (int i = 0; i < cardInfo.widgets.Length; i++) {
		cardInfo.widgets[i].depth = nameIndex * componetCount + i;
		}
		// 如果当前移动的卡牌的index是centercardindex
		// 将toggle设置为选中状态
		cardInfo.GetComponent<UIToggle>().value = nameIndex == centerCardIndex ? true : false;

		// 向前播放动画
		tp.PlayForward();
	}

	// 当点击向左旋转的按钮时
	void OnClickLeftButton()
	{
		foreach (CardInfo item in cardInfoList) {
			int nowIndex = int.Parse(item.name);
			SetPositionAndDepth(item, 1, ++nowIndex);
		}
	}

	// 当点击向右旋转的按钮时
	void OnClickRightButton()
	{
		foreach (CardInfo item in cardInfoList) {
			int nowIndex = int.Parse(item.name);
			SetPositionAndDepth(item, -1, --nowIndex);
		}
	}


	 void OnToggleValueChange()
	{
		if (UIToggle.current.value) {
			// 获取当前点击的toggle的物体名字
			int index = int.Parse(UIToggle.current.name);
			// 需要移动的单位
			int needMoveCount = centerCardIndex - Mathf.Abs(index);

			for (int i = 0; i < needMoveCount; i++) {
				if (index > 0) {
					OnClickLeftButton();
				} else {
					OnClickRightButton();
				}
			}

		}
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity开发】Unity实现英雄联盟选择皮肤效果 的相关文章

  • Unity集成Leap Motion

    转载自 http www cocoachina com game 20150716 12625 html 演示视频文章最后 如果你已经熟悉编程的概念 理解并在C 语言方面有一定的经验 并且对面向对象编程思想和设计概念有所熟悉 如果你了解3D
  • unity如何解决每次写完敲代码,调试时需要卡个进度条

    解决办法如下 勾选上之后程序就可以立刻运行起来了 再也不用一直卡进度条了 不过也有弊端的 会影响静态字段初始化有问题还有Dotween的一些效果会发生变化 谨慎避免入坑
  • 树实现客户端红点系统

    树实现客户端红点系统 红点系统总览 demo 设计 代码设 引用 https zhuanlan zhihu com p 85978429 红点系统总览 如上图所示 规划红点系统的时候 我们将整个系统分为独立的三个部分 结构层 驱动层和表现层
  • unity3D期末作业捕鱼游戏,适合初学者学习使用,包含源程序所有文件

    虚拟现实期末作业捕鱼游戏 免积分下载 点我下载资源 有按钮 背景音乐 可以发射炮弹捕鱼 可以选择难度 可以调节音乐声音大小 有游戏加载进度条 详细情况请看如下动态图 点我下载资源
  • Animator之RootMotion

    Unity3D 中 Generic 动画导入设置和 Root Motion 之间的关系 Unity3D 的 Mecanim 动画系统可以直接复用 3DS MAX 中制作的动画文件中的位移 这个就是通过 applyRootMotion 来达成
  • URP——后期处理特效

    通用渲染管道 URP 包括一个后处理效果的集成实现 如果使用URP 则不需要为后期处理效果安装额外的包 URP与Post Processing Stack v2包不兼容 URP使用体积框架进行后期处理效果 下面的图片显示了一个URP场景有没
  • unity多个贴图shader

    在一个Material上放多个贴图的测试 比如一个plane上放四个贴图 Shader aaa Properties MainTex Texture 2D white MainTex2 Texture 2D white MainTex3 T
  • Unity的Text Mesh Pro文字显示重叠处理

    在使用Text Mesh Pro的时候 出现文字重叠 如图 在编辑器内显示是正确的 最后发现是换行造成的 原本的文字是从pdf中复制过来 就会重叠 在记事本中删除换行用回车再次换行就能正确显示
  • protobuf C#编译

    protobuf C 编译 标签 protobufc 2016 08 30 23 22 342人阅读 评论 1 收藏 举报 分类 工作记录 2 版权声明 本文为博主原创文章 未经博主允许不得转载 1 下载protobuf代码 https g
  • untiy的纹理格式介绍

    Desktop RGB Compressed DXT1 压缩的RGB纹理 这是最常见的漫反射纹理格式 4位 像素 32 KB 256x256 RGBA Compressed DXT5 压缩的RGBA纹理 这是漫反射和高光控制纹理的主要格式
  • Unity笔记:修改代码执行的默认打开方式

    使用 External Tools 偏好设置可设置用于编写脚本 处理图像和进行源代码控制的外部应用程序 External Script Editor 选择 Unity 应使用哪个应用程序来打开脚本文件 Unity 会自动将正确的参数传递给内
  • 闲云:unity中不能识别monobehevior关键字的问题

    有时候一些小问题很恼人 如unity中新建脚本后不能识别monobehevior关键字 在vs2017右侧的解决方案中点击刷新图标 或者把不能识别的脚本添加到vs2017右侧的解决方案中的Assets中即可 还不行就点击 排除 然后再 添加
  • JPush极光推送Unity插件iOS设备无法获取DeviceToken

    前言 最近在使用JPush进行极光推送 Unity插件GitHub地址https github com jpush jpush unity3d plugin 问题描述 但是发现了一个问题 按照官方文档操作 最终仍然无法获取DeviceTok
  • 【Unity灯光与渲染技术】Global Illumination全局光照

    本系列主要参考Unity灯光与渲染技术教程Unity Lighting And Rendering 同时会加上一点个人实践过程和理解 分割线 这篇文章主要讲全局光照 在看教程的时候就有一个点不是很理解 就是作者开启物体的static这个选项
  • Unity里清除Console控制台Log的函数

    Log输出部分转发来自 http blog sina com cn s blog 13c4bf4b40102wz0r html 在控制台输出中 是开发者常用到的一种函数 通过Debug类来实现 打印字符串 Debug Log log 如果有
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • Unity3D之Rigidbody

    目录 常用的Rigidbody属性和方法 rigidbody AddForce rigidbody AddTorque rigidbody velocity rigidbody angularVelocity rigidbody Sleep
  • Unity3d + NGUI 的多分辨率适配

    移动端的多机型适配 现在要介绍的是 锁链战记 这款游戏的适配方法 这种适配方法是UI是一个基础尺寸 背景是一个基础尺寸 背景比UI多出的部分是一些没有实际作用的部分 这样的适配方式避免了在iPhone5这样的小屏幕上镶边 首先设定UIRoo
  • Unity在UI界面上显示3D模型/物体,控制模型旋转

    https blog csdn net ChinarCSDN article details 81058773
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w

随机推荐

  • 【linux】定时任务讲解

    文章目录 一 在某时刻只执行一次 at 1 设置定时任务 2 查看和删除定时任务 二 周期性执行任务 cron 1 启动crond进程 2 编辑定时任务 3 查看和删除 4 用户权限 4 1 黑名单 4 2指定用户 三 etc cronta
  • Head First Design Mode(5)-工厂模式

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 工厂模式 烘烤OO的精华 烘烤某些松耦合的OO设计 除了使用new操作符之外 还有更多制造对象的方法 本章我们将了解到实例化的这个活动不应该总是公开的进行 认识到初始
  • 按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。

    引用 软件秘笈 设计模式那点事 书籍 按照目的来分 设计模式可以分为创建型模式 结构型模式和行为型模式 创建型模式用来处理对象的创建过程 结构型模式用来处理类或者对象的组合 行为型模式用来对类或对象怎样交互和怎样分配职责进行描述 创建型模式
  • redis集群主流架构方案分析

    阿伊土鳖小码农 2017 02 10 09 29 Redis在互联网大数据平台有着广泛的应用 主要被用来缓存热点数据 避免海量请求压垮数据库 同时可以提升服务节点的响应速度和并发量 随着数据量的增多 由于redis是占用单台物理机或虚机的内
  • 【vue3+ts+vant】上传图片

    1 使用 van upload 组件 进行样式和功能配置 组件基础结构 配置文字和图标 配置最多数量和最大体积 支持双向数据绑定 支持选择图片后触发函数 支持点击删除事件函数 基础结构
  • STM32学习(一)-- stm32简介

    目录 前言 一 STM32简介 1 STM32 是什么 2 STM32 应用领域 3 STM32 优势 二 ARM简介 三 STM32芯片 1 芯片命名规则 2 型号分类及缩写 四 STM32F103C8T6 1 STM32F103C8T6
  • 机器学习:均值漂移(Mean Shift)详细解释

    1 均值漂移的基本概念 Mean Shift算法和k means相似 都是一个迭代的过程 即先算出当前点的偏移均值 将该点移动到该偏移均值 以此为新的起始点 继续移动 直到满足最终的条件 1 设想在一个有N个样本点的特征空间 初始确定一个中
  • LL(1)文法解析

    一 问题描述 给定上下文无关文法 对其进行解析 得出first集和follow集 在有能力的情况下 可以求出LL 1 分析表 二 算法设计 本程序主要分成三块内容 第一是文法的读入解析 第二是first集的求解 第三为follow集的求解
  • 蜣螂优化算法(DBO)优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码

    蜣螂优化算法是华大学沈波教授团队 继麻雀搜索算法 Sparrow Search Algorithm SSA 之后 于2022年11月27日又提出的一种全新的群体智能优化算法 已有很多学者将算法用于实际工程问题中 今天咱们用蜣螂优化算法优化一
  • 七种实现web实时消息推送的方案!

    什么是消息推送 push 短轮询 长轮询 iframe流 SSE 我的方式 MQTT Websocket 自定义推送 Github地址 我有一个朋友 做了一个小破站 现在要实现一个站内信web消息推送的功能 对 就是下图这个小红点 一个很常
  • Python九九口诀表

    九九口诀1 py for i in range 1 10 for j in range 1 i 1 k j i print format j i k end t print n 九九口诀2 py for i in range 1 10 fo
  • 利用OpenSSL实现非阻塞通讯C++代码

    可以转载 转载请注明出处 谢谢 关于OpenSSL的原理以及OpenSSL如何安装 使用 测试demo请参看我之前的两篇博文 这篇博文主要实现了如何在win64下基于VS2012实现OpenSSL的非阻塞通讯 参考了以下几篇博文的内容 表示
  • gcov lcov, 部分代码无法生成 gcda 的原因解决

    参考http blog csdn net lostaway article details 40948841 配置 项目有多个module 组成 一部分有gcda 生成 一部分没有 原因是这部分module 在循环处理 永远不退出 使用 k
  • ResNet系列及其变体(六)—DarkNet53

    本篇主要介绍DarkNet53 其他ResNet系列及其变体介绍见如下blog ResNet系列及其变体目录 DarkNet53 YOLOv3 An Incremental Improvement Darknet53是经典的一个深层网络 结
  • 51单片机的步进电机控制系统(仿真+程序+报告+原理图)

    1 主要功能 该系统由AT89C51单片机 数码管模块 步进电机模块 按键模块构成 可实现功能 1 按键控制步进电机正反转 加减速 停止 2 2个发光二极管显示正反转 1位7段LED数码管显示当前转速档位 共9个档位 3 4个红色LED 指
  • java 8 stream 处理对于 List<Map<String,Object>> 数据的分组求和

    java 8 stream 处理对于 List
  • [914]linux如何批量关闭进程

    碰到需要杀掉某一类进程的时候 如何批量杀掉这些进程 使用awk命令是很好的选择 代码 ps ef grep aaa grep v grep awk print kill 9 2 sh ps ef grep aaa grep v grep 这
  • 查看Linux下网卡状态

    ip link 命令 或者 通过mii tool指令 root localhost root mii tool eth0 negotiated 100baseTx FD link ok eth1 no link 或 root localho
  • 网络通信的整个流程

    1 网络通信流程 你的电脑打开浏览器 访问www baidu com 先将请求信息发给了交换机 然后交给了路由器 路由发给DNS服务器 通过DNS协议去找我们要访问的百度的IP地址 查到的百度服务器对应的IP地址之后 路由器通过路由协议找到
  • 【Unity开发】Unity实现英雄联盟选择皮肤效果

    using UnityEngine using System Collections