unity 模型透明渐变有没有potion渐变的方法

Unity(29)
Shader(13)
转载请注明出处
1.3.1、从简单的模板程序开始
1、打开Unity程序,在Project中选择Create 选择Shader&Unlit Shader。程序的名字最好和shader的用途有关联,让人一看就知道这个shader是用来做什么的。
2、将下面的模板程序复制到这个新建的Shader程序文件中,替换Unity自动生成的代码。程序注释部分给出了每一行代码的含义。
Shader &Cg Minimal shader& { // 定义Shader的名字,这个名字胡出现控制面 //板上作为材质的shader程序索引,还可以通过加“/”来将shader程序归类
//如:Custom/Cg Minimal shader
SubShader { // 一个Shader有多个SubShader,Unity会自动选择最合适的
Pass { // 一个SubShader有多个Pass块
CGPROGRAM // Unity的Cg程序预编译命令
#pragma vertex vert
// 定义一个顶点着色器程序名字为vert
#pragma fragment frag
// 定义一个片段着色器程序名字为frag
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
// 顶点着色器程序,参数进行语义绑定
//POSITION为输入绑定,SV_POSITION为输出绑定
return mul(UNITY_MATRIX_MVP, vertexPos);
// 用内置的矩阵UNITY_MATRIX_MVP转变顶点着色器程序的输入数据
//vertexPos并返回这个转变之后的数据,之后它将作为片段
// 着色器程序的输入参数
float4 frag(void) : COLOR // 片段着色器,它的输入语义这里用了Void
//表示接受所有的类型,你还可以换成和顶点、
//程序的输入一样的语义
//float4 vertexPos : POSITION(SV_POSITION)
//用COLOR进行输出语义绑定
return float4(1.0, 0.0, 0.0, 1.0);
ENDCG // 结束Cg程序的预编译命令
3、创建一个材质球,Unity中有多种方式来对这个材质球进行shader程序绑定,推荐使用一个简便的方式,可以在创建材质球的时候,选择你要绑定的shader程序,然后点Create&Material。这是最方便直接的方式,不仅名字会保持和shader文件名一样,同时还将此shader同材质进行了绑定,其他的方式都比较繁琐。
4、创建一个Cube并将这个材质球赋给这个Cube,Cube显示为完全的红色,如果不是则说明这个Shader程序没有被编译,此时只需要关闭并重新打开即可。
注:本文中规定Shader即为顶点着色器和片段着色器,在别的文章中Shader只是顶点着色器和片段着色器中的一个。
1.3.2、Unity中顶点和片段程序的输入输出
1、顶点程序的输入参数绑定:在上一小节中顶点程序vert中通过SV_POTION进行了输出语义绑定,返回的值即为片段程序的输入参数,那么顶点程序的输入参数是从哪里来的呢?在Unity中顶点程序的输入参数来自于一个物体的Mesh Render组件,每一帧它会自动将物体的所有mesh数据发送给GPU,这个就是所谓的drawcall。mesh即物体模型的网格,如果网格数少,draw call自然就会减少。网格上的数据包括位置、法线、颜色等信息。这些信息都有对应的语义词,可以通过语义词进行绑定。定义结构体的方法进行顶点程序输入语义绑定,如:
struct vertexInput {
float4 vertex : POSITION; // 模型空间的位置
float4 tangent : TANGENT;
// 模型表面的切线
float3 normal : NORMAL; // 模型表面的法线,它通常是单位长度
float4 texcoord : TEXCOORD0;
// 第0套贴图坐标
// (也称为UV坐标,范围在0~1之间)
float4 texcoord1 : TEXCOORD1; // 第1套贴图坐标,
fixed4 color : COLOR; // 颜色
2、Unity中内置的输入参数结构体:Unity中内置了一些顶点程序的输入参数的结构体,在Unity&Editor&Data&CGInclude&UnityCG.cginc文件中可找到,
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
fixed4 color : COLOR;
// 多个贴图UV坐标并不是在每一个显卡上都支持
struct appdata_img {
float4 vertex : POSITION;
half2 texcoord : TEXCOORD0;
要在代码中使用这些内置结构体一定要添加命令#include “UnityCG.cginc”。如下代码:
Shader &Cg shader parameters& {
SubShader {
#pragma vertex vert
#pragma fragment frag
#include &UnityCG.cginc&
struct vertexOutput {
float4 pos : SV_POSITION;
float4 col : TEXCOORD0;
vertexOutput vert(appdata_full input)
output.pos =
mul(UNITY_MATRIX_MVP, input.vertex);
output.col = input.
float4 frag(vertexOutput input) : COLOR
return input.
3、更改顶点程序的输出参数:将顶点程序中的output.col
= input.texcoord代码替换成如下的代码可以得到不同的效果:
output.col = float4(input.texcoord.x, 0.0, 0.0, 1.0);
//output.col = float4(0.0, input.texcoord.y, 0.0, 1.0);
//output.col = float4(
(input.normal + float3(1.0, 1.0, 1.0)) / 2.0, 1.0);
1.3.3、Unity中控制Shader变量方法
Uniform参数的应用:Uniform通常都是用来修饰一些由应用程序传入的离散数据,如:
&span style=&font-size:18&&uniform float4x4 Object2W&/span&
表示从外部传入一个四乘四的矩阵,如此,Shader程序就可以和外部的应用程序进行交互。在Unity中可以通过控制面板或者C#脚本来控制这些变量。
1、控制面板上控制uniform参数:在上面的模板程序的基础上添加一个属性,代码如下:
Shader &Unlit/Propertey&
//添加一个属性块,在属性块中定义一个变量
Properties{
_Color(&color&, Color) = (0.0, 1.0, 0.0, 1.0)
SubShader{
#pragma vertex vert
#pragma fragment frag
//在Pass块中使用该属性块中的变量必须要使用
//uniform关键字重新定义该变量
uniform float4 _C
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
return mul(UNITY_MATRIX_MVP, vertexPos);
float4 frag(void) : COLOR
在SubShader上面添加了一个属性模块,属性块中定义了一个颜色变量_Color,属性模块中变量的定义形式为:
_ParamName(&Display Name&,ParamType)=defaultValue[{options}]
●_ParamName:该属性变量的名字,Shader代码中即使用这个变量名字来索引;
●Display Name:在控制面板上显示该属性的名字,在Unity中可以是中文;
●ParamType:该属性变量的类型,这个类型并不是Cg语言的数据类型,而是Unity中特有的属性类型,在Unity中属性变量的类型以及各自对应的Cg数据类型为:
●数值类型:
●Range(min,max):会在控制面板上显示一个滑动条,最小值为min,最&&&&&&& 大值为max,值的类型为浮点类型;
●Flaot:浮点类型数据,注意此处第一个字母大写;
●Int:整数类型数据,注意此处第一个字母的大写;
●向量类型:
●Color:颜色属性,也是一个四维的向量,值的范围为0~1;
●Vector:四维向量,值可以任意指定;
●贴图类型:
●2D:2的阶数(如256,1024等)大小的贴图,它的坐标UV范围(0~1,0~1);
●Rect:非2的阶数的大小的贴图,它的坐标UV的范围(0~1,0~1);
●Cube:立方体贴图,即六张2D贴图的组合;
●3D:3D纹理贴图,Unity的脚本和Shader中支持3D贴图的使用和创建,&&&& 但是3D贴图的使用不能像2D贴图那样直接。它的坐标UVW的范围&&&&&&& (0~1,0~1,0~1),常见的应用如,火焰、烟雾以及光线等。
定义了属性块中的变量必须要在Pass块中使用uniform关键字重新定义这个变量才能在该Pass块的Shader代码中使用,如果有多个Pass块都会使用这个变量就必须要在每一个Pass块中都重新定义这个变量。在上面的代码中的第一个Pass块中使用uniform定义了变量_Color,在之后的Pass块中要使用都必须定
#pragma fragment frag
uniform float4 _C
//如果有多个Pass块使用这个变量,需要在每一个Pass中都定义这个变量
uniform float4 _C
义这个变量。uniform变量的定义必须在CGPROGRAM~ENDCG之间,否则会编译报错,最好的习惯是将变量的定义在紧跟CGPROGRAM之后。
●option:这个选项只对2D、Rect以及Cube贴图有用,它是在没有选中用户自己的贴图时候默认使用Unity内置的贴图来填充,这些贴图的类型可以是&“white”,“black”, “gray” 以及 “bump”中的一种,也可以为空。
属性的个性显示:
●[HideInInspector]:在控制面板上隐藏这个属性变量,直接在属性块中的变量前面添加即可,如:
Properties{
[HideInInspector]
_Color(&color&, Color) = (0.0, 1.0, 0.0, 1.0)
●[NoScaleOffset]:这个是针对贴图变量的,隐藏控制面板中的贴图变量的tilling和offset
●[Gamma]:将float和Vector类型的属性在控制面板上显示成类似颜色属性那样的UI交互面板,常用的类型有:
&&& ●Toggle]:定义float类型的属性变量,在控制面板上将显示一个勾选框如:
[Toggle] _Invert(&Invert?&, Float) = 0
这个变量的值为1或0,勾选表示1,反之为0;
&&& ●[Enum]:定义float类型的属性变量,控制面板上显示一个下拉列表,下拉列表中可以选择自定义的数据,如:
[Enum(One,1,Two,2)] _Num (&Num Enum&, Float) = 1
在控制面板上将显示下拉列表,列表中有两个变量One和Two,它们的值分别为1和2。最大能枚举的列表量个数为7个;
&&& ●[KeywordEnum]:定义float类型的属性变量,在控制面板上显示一个下拉列表,里面可以枚举Shader的关键字。
&&& ●[PowerSlider]:定义Range类型的变量,Range变量本来就会在控制面板上显示滑动条,但是在拖动的时候变量的值是以线性进行增减的,而加上这个特性的Range变量会以指定的指数形式增减。如:
[PowerSlider(2.0)] _Shin (&Shin&, Range (0.01, 1)) = 0.1
在控制面板上拖动这个变量将会以2次曲线的形式进行增减。
& [Space]:定义所有类型的变量,使得变量在控制面板上距离上一个变量保持一定的距离,如:其中50表示间隔的空间,可以不添加,也即为默认一个空格的距离
[Space(50)] _Prop (&Prop&, Float) = 0
●[Header]:定义所有类型的变量,能在控制面板上显示自定义的变量标题,如:“Floatvariable”会出现在控制面板上变量的上方,不能为中文。
[Header(Float variable)] _P (&P&, Float) = 0
2、在代码中控制uniform参数:
要在代码中控制uniform的参数,可以不用在属性块中定义,只需要在Shader代码中使用关键字uniform定义变量。修改上述的Shader代码如下:
Shader &Unlit/Propertey&
//添加一个属性块,在属性块中注释掉刚刚定义的变量
Properties{
//_Color(&color&, Color) = (0.0, 1.0, 0.0, 1.0)
SubShader{
#pragma vertex vert
#pragma fragment frag
//必须使用uniform关键字定义该变量才能在C#脚本
uniform float4 _C
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
return mul(UNITY_MATRIX_MVP, vertexPos);
float4 frag(void) : COLOR
创建一个C#脚本,将下面的代码复制到新建的C#脚本中,并将这个脚本拖到上述Shader的物体上,保证C#脚本和Shader代码运行在同一个物体上。
using UnityE
using System.C
[ExecuteInEditMode]
public class Propertey : MonoBehaviour {
private Renderer _
// Use this for initialization
void Start () {
_renderer=GetComponent&Renderer&();
// Update is called once per frame
void Update () {
_renderer.sharedMaterial.SetColor(&_Color&, new Color(1, 1, 0, 0.5f));
本段代码中在类的前面添加了[ExecuteInEditMode],保证脚本可以在编辑状态下就被运行。通过代码
_renderer.sharedMaterial.SetColor(&_Color&, new Color(1, 1, 0, 0.5f));
对shader中的“_Color”变量进行设置,你可以通过更改代码中的值类浏览变换的效果。
sharedMaterial和material的区别:代码中可以将sharedMaterial替换成material,编译会报错并提示我们使用sharedMaterial,此处是因为在编辑模式下运行,如果去掉编辑模式,直接运行得到的效果也是一样的。material是针对当前的材质,在当前的材质基础上再实例化一个材质,使用material的时候,如图1.5所示,会在该材质球的后面添加了“(Instance)”,表示这个脚本
在使用material控制是只对当前的材质球有效,对其他使用该材质球的物体无
图1.5C#脚本中使用material控制uniform参数
效。而在使用sharedMaterial的时候是没有“(Instance)”,在C#脚本中对该材质球进行修改会影响到其他使用该材质球的物体。如此,我们必须要在使用脚本控制的时候区别对待。
脚本控制的常用方法:
Color GetColor(string propertyName):通过属性名字获取颜色属性值,并使用这个值作为返回值;
float GetFloat(string PropertyName):通过属性名字获取一个浮点类型的属性值,并使用值作为返回值;
int GetInt(string PropertyName):通过属性名字获取一个整数类型的属性值,并将这个值作为返回值;
TextureGetTexture(string PropertyName):通过属性名字来获取一个贴图,并将这个贴图作为返回值;
对应Color、float、int以及Texture的还有设置方法,都是通过属性名字来对相应的属性进行设置,更多的方法请参阅Unity官网文档,网址为:
1.3.4、Unity中写Shader程序应用
新建一个Shader程序,将下面的代码复制到这个Shader程序文件中
Shader &UnityCg/worldSpaceColor&
Properties{
_Point(&原点&, Vector) = (0., 0., 0., 1.0)
_DistanceNear(&阈值距离&, Float) = 5.0
_ColorNear(&离原点小于阈值距离的点的颜色&, Color) = (0.0, 1.0, 0.0, 1.0)
_ColorFar(&离原点大于阈值距离的点的颜色&, Color) = (0.3, 0.3, 0.3, 1.0)
SubShader{
#pragma vertex vert
#pragma fragment frag
#include &UnityCG.cginc&
//使用关键字uniform再定义属性中的变量
uniform float4 _P
uniform float _DistanceN
uniform float4 _ColorN
uniform float4 _ColorF
struct vertexInput {
float4 vertex : POSITION;
struct vertexOutput {
float4 pos : SV_POSITION;
float4 position_in_world_space : TEXCOORD0;
vertexOutput vert(vertexInput input)
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
//_Object2World是Unity内置的四乘四矩阵,使用了#include &UnityCG.cginc& 命令就可以直接使用,不用再使用uniform关键字进行定义
output.position_in_world_space =
mul(_Object2World, input.vertex);
float4 frag(vertexOutput input) : COLOR
//计算原点和这个物体的片段点之间的距离
float dist = distance(input.position_in_world_space,
if (dist & _DistanceNear)
return _ColorN
return _ColorF
这个程序实现的效果即:物体在世界坐标系的位置与预设的原点位置“Point”的距离小于阈值“DistanceNear”部分就显示“ColorNear”的颜色值,大于阈值“DistanceNear”部分就显示“ColorFar”的颜色值。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:14377次
排名:千里之外
原创:31篇
评论:18条
文章:11篇
阅读:3583
文章:15篇
阅读:8330
(2)(5)(5)(1)(1)(1)(2)(1)(3)(2)(3)(3)(1)(1)(1)unity学习笔记
一、分析物品属性
类型(药品Drug)
加血量值
加魔法值
出售价格
购买价格
2、把信息录入text文件(Assets目录下)
对应上面表中的信息逐次录入
1001,小瓶血药,icon-potion1,Drug,50,0,50,60
1002,大瓶血药,icon-potion2,Drug,100,0,70,100
1003,蓝药,icon-potion3,Drug,0,100,60,80
注:icon为物品图片的名称
二、创建物品信息管理类
// id 名称 Icon名称 类型(药品Drug) 加血量值 加魔法值 出售价 购买价
public class ObjectInfo
public string icon_//这个名称是存储在图集中的名称
public ObjectT
public int price_
public int price_
三、在程序中读取文本
using UnityE
using System.C
using System.Collections.G//使用字典
/*管理物品信息*/
public class ObjectsInfo : MonoBehaviour {
public static ObjectsInfo _
public TextAsset objectInfoL
private Dictionary&int,ObjectInfo& objectInfoDict = new Dictionary&int,ObjectInfo&();
void Awake()
_instance =
ReadInfo();
Debug.Log(objectInfoDict.Keys.Count);
//通过ID得到物品信息
public ObjectInfo GetObjectInfoById(int id)
ObjectInfo info =
objectInfoDict.TryGetValue(id, out info);
//读取文本信息
void ReadInfo()
string text = objectInfoList.
string[] strArray = text.Split('\n');//读取每一行
foreach (string str in strArray)
string[] proArray = str.Split(',');
ObjectInfo info = new ObjectInfo();
int id = int.Parse(proArray[0]);
string name = proArray[1];
string icon_name = proArray[2];
string str_type = proArray[3];//枚举设置类型switch(str_type){case &Drug&:type=ObjectType.D}
int hp = int.Parse(proArray[4]);
int mp = int.Parse(proArray[5]);
int price_sell = int.Parse(proArray[6]);
int price_buy = int.Parse(proArray[7]);
info.id = info.name = info.icon_nmae = icon_ info.type =
info.price_buy = price_ info.price_sell = price_
info.hp = info.mp =
objectInfoDict.Add(id, info);//添加到字典,id为key,可以方便的查找
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3839次
排名:千里之外
原创:23篇
(2)(1)(1)(1)(7)(2)(1)(9)(2)unity商店demo学习:鸟瞰视角RPG游戏 - 移动开发当前位置:& &&&unity商店demo学习:鸟瞰视角RPG游戏unity商店demo学习:鸟瞰视角RPG游戏&&网友分享于:&&浏览:0次unity商店demo学习:俯视视角RPG游戏一下所有素材和源码都来自unity商店的实例 Top-Down RPG Starter Kit
,这个demo是unity商店上最好的入门级rpg游戏实例,麻雀虽小,五脏俱全,想要弄清楚一个标准的rpg游戏的方方面面,这个是很好的选择。
ps:demo写得很高深,看得不是很懂,准备慢慢研究。
来一张工程全貌图。
这是一个俯视视角(可以调整视角)的卡通风格3D角色扮演游戏,配着动听又欢快的背景音乐,还有那萌萌哒的怪物,仿佛又回到了初中时玩冒险岛online的时候~~,额,不废话,主要模块如下:
游戏主菜单界面游戏角色选择场景游戏角色控制摄像机控制角色成长系统NPC对话和任务系统技能系统背包系统装备系统商店系统小地图游戏怪物AI怪物掉落和拾取怪物boss游戏HUD GUI音乐和音效存档系统
缺少地图系统、骑宠系统和副本系统
以下就逐个来体验吧。
游戏主菜单界面
加载了基本游戏场景、灯光、天空盒以及主菜单界面GUI
主要由四个脚本控制
ControlTitleScene控制摄像机移动和文字效果
AlphaText控制开始时画面由模糊到清晰
NewGameButton开始新游戏
LoadGameButton加载存档
其中两个button是用GUITexture控件实现的,并非ugui或者legacy ui
&span style=&white-space:pre&& &/span&void OnMouseUp()
this.guiTexture.texture = buttonN
Invoke(&LoadScene&,0.1f);
void OnMouseDown()
if(buttonSfx != null)
AudioSource.PlayClipAtPoint(buttonSfx,transform.position);
this.guiTexture.texture = buttonD
void LoadScene()
Application.LoadLevel(loadSceneName);;
游戏角色选择场景
依然是加载了基本游戏场景、灯光、天空盒以及主菜单界面GUI,还有游戏角色。
这个场景可以创建自己的角色,有剑士和法师两个角色可选。
由四个脚本控制
ButtonOK确定角色选取
ButtonSelected用于切换角色按钮
Etenname获取用户的字符输入
SelectCharacter用于呈现选取的角色,隐藏未选取的角色,动态实例化的坐标点在场景中庸空物体标出
其中动态实例化角色是一个关键点
public class SelectCharacter : MonoBehaviour {
public GameObject[]
//your hero
public GameObject buttonNext,buttonP //button prev and button next
[HideInInspector]
public int indexHero = 0;
//index select hero
private GameObject[] heroI //use to keep hero gameobject when Instantiate
// Use this for initialization
void Start () {
heroInstance = new GameObject[hero.Length]; //add array size equal hero size
indexHero = 0; //set default selected hero
SpawnHero(); //spawn hero to display current selected
//check if hero is less than 1 , button next and prev will disappear
if(hero.Length &= 1)
buttonNext.SetActive(false);
buttonPrev.SetActive(false);
//Check show only selected character
public void UpdateHero(int _indexHero)
for(int i=0; i&hero.Li++)
//Show only select character
if(i == _indexHero)
heroInstance[i].SetActive(true);
//Hide Other Character
heroInstance[i].SetActive(false);
//Spawn all hero
public void SpawnHero()
for(int i=0;i&hero.Li++)
heroInstance[i] = (GameObject)Instantiate(hero[i],transform.position,transform.rotation);
UpdateHero(indexHero);
游戏角色控制
依然是加载了基本游戏场景、灯光、天空盒以及主菜单界面GUI,还有游戏角色、若干NPC以及怪物。
角色控制有下列脚本,但此处只说游戏行走、技能控制
HeroController控制角色行走和发招
SpawnPointHero角色出生点和重新出生
AreaSkillCursor控制群攻技能操作范围
SkillArea计算群攻范围和目标数
AnimationManager控制角色行走和攻击动画
==代码没看懂T_T
摄像机控制
摄像机视角可以调成俯视和普通近距离3D模式,并且摄像机跟随离角色的距离也可以自由调整
主要控制脚本
MinimapCamera控制摄像机目标跟随和迷你小地图坐标定位
MouseOrbit控制视角旋转和缩放
其中旋转用到了四元数,很基本的图形学
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 calPos = new Vector3(0, 0, -distanceLerp);
position = rotation * calPos + target.transform.
transform.rotation =
角色成长系统
角色的HP,MP以及经验值管理和升级,属性加点
由PlayerStatus脚本管理
==代码依然没看懂T_T
NPC对话和任务系统
与NPC对话并接任务
NpcSetup控制NPC的生成和都对话框的交互
比如检测任务是否完成和给予奖励
bool CheckConditionItem(int id,int amout)
for(int i =0;i&inventory.bag_item.Ci++)
if(inventory.bag_item[i].item_id == id && inventory.bag_item[i].item_amount &= amout)
inventory.bag_item[i].item_amount -=
if(inventory.bag_item[i].item_amount &= 0)
inventory.bag_item[i].item_id = 0;
void GiveReward(int id)
for(int i=0;i&questData.questSetting.Ci++)
if(questID == questData.questSetting[i].questID)
inventory.GiveItem((int)questData.questSetting[i].itemIDReward.x,(int)questData.questSetting[i].itemIDReward.y);
Debug.Log(&Give&);
技能系统包括技能的激活、学习、加点、属性加成、技能快捷键
由PlayerSkill脚本控制
==代码依然没看懂T_T
管理背包物品,可以物品可拖拽到装备窗口和技能快捷窗口
由脚本Item_Data控制
public enum Equipment_Type{
Null = 0, Head_Gear = 1, Armor = 2, Shoes = 3, Accessory = 4, Left_Hand = 5, Right_Hand = 6, Two_Hand = 7
有药品商店和装备商店两种
脚本Item_data,Item_obj,ShopItemlist脚本控制,一个公共类实现两个商店的实例
例如购买商品
public Item Get_Item(int item_id){
int i = 0;
bool isEnd =
if(isEnd == false){
while(i & item_equipment_set.Count){
if(item_id == item_equipment_set[i].item_ID){
return item_equipment_set[i];
i = item_equipment_set.C
if(isEnd == false){
while(i & item_usable_set.Count){
if(item_id == item_usable_set[i].item_ID){
return item_usable_set[i];
i = item_usable_set.C
if(isEnd == false){
while(i & item_etc_set.Count){
if(item_id == item_etc_set[i].item_ID){
return item_etc_set[i];
i = item_etc_set.C
if(isEnd == false){
while(i & item_gold.Length){
if(item_id == item_gold[i].item_ID){
return item_gold[i];
i = item_gold.L
小地图用于位置概览和自动导航,可以缩放
由脚本MinimapSignSetup和MinimapCamera来控制
其中设置商店、角色和怪物的标记点
void TextureSetup ()
if(signType == MinimapSignType.Player)
this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[0];
}else if(signType == MinimapSignType.Enemy)
this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[1];
}else if(signType == MinimapSignType.Boss)
this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[2];
}else if(signType == MinimapSignType.Npc)
this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[3];
}else if(signType == MinimapSignType.ShopWeapon)
this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[4];
}else if(signType == MinimapSignType.ShopPotion)
this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[5];
}else if(signType == MinimapSignType.SavePoint)
this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[6];
}else if(signType == MinimapSignType.Quest)
this.gameObject.renderer.material = MinimapSign.Instance.minimapSignMat[7];
游戏怪物AI
怪物AI包括怪物跟踪,攻击等行为
DetectArea检测与角色的碰撞
DropItem控制怪物掉落
EnemyController控制怪物行走和攻击
EnemyStatus控制怪物血条状态
Monster_Data管理怪物数据
怪物跟踪只是简单的使用了直线移动
// Move to destination
if(ctrlAnimState == ControlAnimationState.Move){
if(controller.isGrounded){
movedir = Vector3.
movedir = transform.TransformDirection(Vector3.forward*moveSpeed);
movedir = Vector3.Lerp(movedir,Vector3.zero,Time.deltaTime * 10);
movedir.y -= 20 * Time.deltaT
controller.Move(movedir*Time.deltaTime);
怪物掉落和拾取
public void UseDropItem(){
for(int i = 0; i & item_Drop_List.C i++){
float percentResult = Random.Range(0,100);
if(percentResult & item_Drop_List[i].percentDrop){
GameObject go = (GameObject)Instantiate(item_Obj_Pref,transform.position+(Vector3.up),Quaternion.identity);
go.rigidbody.AddForce(new Vector3(Random.Range(-1,1)*1.5f*powerImpulse,1*3*powerImpulse,Random.Range(-1,1)*1.5f*powerImpulse),ForceMode.Impulse);
Item_Obj item_obj = go.GetComponent&Item_Obj&();
item_obj.item_id = item_Drop_List[i].item_
item_obj.SetItem();
if(item_obj.gold){
item_obj.gold_price = Random.Range(gold_min, gold_max);
boss其实跟普通怪物差不多,只不过数值要高不少
游戏HUD GUI
主要是游戏抬头界面,包括角色血条、魔条和经验条,技能快捷键栏还有系统菜单
BottomBar绘制技能快捷栏
CommanMenu绘制系统命令栏,背包,技能,装备,状态等
EnemyHP绘制敌人的血条
HeroStatusBar绘制角色HP,MP和头像
没有使用NGUI或者UGUI,全部是legacy gui
GUI.BeginGroup(new Rect(posHPbar.x, posHPbar.y,sizeHPBar.x,sizeHPBar.y));
GUI.DrawTexture(new Rect(0,0, sizeHPBar.x ,sizeHPBar.y), hpBar);
GUI.BeginGroup(new Rect(0,0,ConvertHP(sizeHPBar.x,maxHP,curHP),sizeHPBar.y));
GUI.DrawTexture(new Rect(0,0,sizeHPBar.x,sizeHPBar.y), hpCurrent);
GUI.EndGroup();
GUI.EndGroup();
音乐和音效
音乐和音效统一管理
由SoundManager脚本统一控制
public void PlayingSound(string _soundName){
AudioSource.PlayClipAtPoint(sound_List[FindSound(_soundName)].audioClip, Camera.mainCamera.transform.position);
private int FindSound(string _soundName){
int i = 0;
while( i & sound_List.Count ){
if(sound_List[i].soundName == _soundName){
游戏可以到指定地点存档,然后在游戏开始时可以读档
不过脚本貌似没找到,不知道用什么存储档案T_T
ps:demo看着真是赏心悦目啊,可惜看得不是太懂,暂时没有能力模仿,只能慢慢来~
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有}

我要回帖

更多关于 unity shader uv渐变 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信