怎么查看unity版本旧版本的doc

Shader摄像机死亡效果
1:Shader脚本
来源网址:&作者:&
最他妈好的解释 &没有之一
struct&SurfaceOutput&{
& half3&A&//&纹理颜色值(r,&g,&b)& half3&N&//&法向量(x,&y,&z)& half3&E&//&自发光颜色值(r,&g,&b)& half&S&//&镜面反射度& half&G&//&光泽度& half&A&//&不透明度
ambient 环境光
shader数据类型
fixed 取值范围[-2,2]
同步动画 &在人物身上绑定来性格组件:networkidentity,
Out和Ref的区别
来源网址:&作者:&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&& class Program&&& {&&&&&&& static void Main(string[] args)&&&&&&& {
     &&&&//先声明,但不初始化
     User _user=new User();&&&&&&
     _user.Name(out&tmp);&&&&&&&&//调用Name方法
&&&&&&&&&&&&& Console.WriteLine("{0}",tmp); //这时tmp的值为&在这里面赋值了&
&&&&&&&&&&&&& Console.ReadKey(true);
  class User
    public&void Name(out&string&tmps)
&&&&&&&&&& {
     & tmps="在这里面赋值了";
&&&&&&&&&&&}
&&&&&&&结果:
&&&&&&&&&&&&& 在这里面赋值了
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&ref的使用
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&& class Program&&& {&&&&&&& static void Main(string[] args)&&&&&&& {
     string tmp="传值之前";&&&&//声明并初始化&&&&&&& 这时如果输出tmp值为"传值之前"
  &&&&&&&&User _user=new User();
&&&&&&&&&&&&& _user.Name(ref&tmp);
&&&&&&&&&&&&& Console.WriteLine("{0}",tmp);
&&&&&&&&&&&&& Console.ReadKey(true);
&&& class User
&&&&&&&& public void Name(ref&string&tmps)
&&&&&&&& {
&&&&&&&&&&&&&&tmps="传值之后";
&&&&&&&&&}
&&&&结果:
&&&&&&&&&&传值之后
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。
ref是&&& 有进有出,而out是&&&&&& 只出不进。
根据Txt文件数据生成地图
从文件读东西用:StreamReader;
&&&&&&&&&&
另一个脚本:Node类
&&递归先序
遍历二叉树递归非递归
来源网址:&作者:&
递归实现先序中序后序遍历二叉树:
&//先序遍历&&
&&&&&&&&static&void&PreOrder&T&(nodes&T&&rootNode)&&
&&&&&&&&{&&
&&&&&&&&&&&&if(rootNode&!=null&)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&Console.WriteLine(rootNode.Data);&&
&&&&&&&&&&&&&&&&PreOrder&&T&(rootNode.LNode&);&&
&&&&&&&&&&&&&&&&PreOrder&&T&(rootNode.RNode);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&//中序遍历二叉树&&&&
&&&&&&&&static&void&MidOrder&T&(nodes&T&&rootNode)&&&
&&&&&&&&{&&&&
&&&&&&&&&&&&if&(rootNode&!=&null)&&&&
&&&&&&&&&&&&{&&&&
&&&&&&&&&&&&&&&&MidOrder&T&(rootNode.LNode);&&&&
&&&&&&&&&&&&&&&&Console.WriteLine(rootNode.Data);&&&&
&&&&&&&&&&&&&&&&MidOrder&T&(rootNode.RNode);&&&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&&&&&//后序遍历二叉树&&&
&&&&&&&&static&void&AfterOrder&T&(nodes&T&&rootNode)&&&&
&&&&&&&&{&&&&
&&&&&&&&&&&&if&(rootNode&!=&null)&&&&
&&&&&&&&&&&&{&&&&
&&&&&&&&&&&&&&&&AfterOrder&T&(rootNode.LNode);&&&&
&&&&&&&&&&&&&&&&AfterOrder&T&(rootNode.RNode);&&&
&&&&&&&&&&&&&&&&Console.WriteLine(rootNode.Data);&&&&
&&&&&&&&&&&&}&&&&
&&&&&&&&}&&
时间复杂度和空间复杂度
快速排序用来处理大量数据;
时间复杂度用o表示
一层循环:O(n);
二层循环:O(n2);冒泡排序
快排时间复杂度:O(n*Logn)
宽度优选寻路算法(BFS)
编辑器扩展
[MenuItem("GameObject/Transform/Position")]
Static void Created()
点击Position会触发
FileStream类
来源网址:&作者:&
对流进行操作时要引用 using System.IO; 命名空间
FileStream常用的属性和方法:
CanRead&判断当前流是否支持读取,返回bool值,True表示可以读取
CanWrite&判断当前流是否支持写入,返回bool值,True表示可以写入
Read()&从流中读取数据,返回字节数组
Write()&将字节块(字节数组)写入该流
Seek()&设置文件读取或写入的起始位置
Flush()&清除该流缓冲区,使得所有缓冲的数据都被写入到文件中
Close()&关闭当前流并释放与之相关联的所有系统资源
文件的访问方式:(FileAccess)
包括三个枚举:
FileAccess.Read(对文件读访问)
FileAccess.Write(对文件进行写操作)
FileAccess.ReadWrite(对文件读或写操作)
文件打开模式:(FileMode)包括6个枚举
FileMode.Append&打开现有文件准备向文件追加数据,只能同FileAccess.Write一起使用
FileMode.Create&指示操作系统应创建新文件,如果文件已经存在,它将被覆盖
FileMode.CreateNew&指示操作系统应创建新文件,如果文件已经存在,将引发异常
FileMode.Open&指示操作系统应打开现有文件,打开的能力取决于FileAccess所指定的值
FileMode.OpenOrCreate&指示操作系统应打开文件,如果文件不存在则创建新文件
FileMode.Truncate&指示操作系统应打开现有文件,并且清空文件内容
文件共享方式:(FileShare)
FileShare方式是为了避免几个程序同时访问同一个文件会造成异常的情况。
文件共享方式包括四个:
FileShare.None&谢绝共享当前文件
FileShare.Read&充许别的程序读取当前文件
FileShare.Write&充许别的程序写当前文件
FileShare.ReadWrite&充许别的程序读写当前文件
使用FileStream类创建文件流对象:
FileStream(String 文件路径,FileMode 文件打开模式)
FileStream(String 文件路径,FileMode 文件打开模式,FileAccess 文件访问方式)
FileStream(String 文件路径,FileMode 文件打开模式,FileAccess 文件访问方式,FileShare 文件共享方式)
//在C盘创建a.txt文件,使用fs流对象对文件进行操作,fs的工作模式是新建(FileMode.Create)
FileStream fs=new FileStream(@"c:\a.txt",FileMode.Create);
//在C盘创建a.txt文件,使用fs流对象对文件进行操作,fs工作模式是新建(FileMode.Create)文件的访问模式是写入(Fileaccess.Write)
FileStream fs=new FileStream(@"c:\a.txt",FileMode.Create,FileAccess.Write);
//在C盘创建a.txt文件,使用fs流对象对文件进行操作,fs工作模式是新建(FileMode.Create)文件的访问模式是写入(FileAccess.Write)文件的共享模式是谢绝共享(FileShare.None)
FileStream fs=new FileStream(@"c:\a.txt",FileMode.Create,FileAccess.Write,FileShare.None);
使用File类来创建对象:(常用)
自定义打开文件的方式:File.Open(String,FileMode);
打开文件进行读取:&File.OpenRead(String);
打开文件进行写入:&File.OpenWrite(String);
示例如下:
//在C盘新建123.txt文件,使用流对象fs对文件进行操作,fs可以行文件内容追加操作FileMode.Append
FileStream fs=File.Open(@"c:\123.txt",FileMode.Append);
//在C盘新建123.txt文件,使用流对象fs对文件进行操作,fs可以进行读文件File.OpenRead()
FileStream fs=File.OpenRead(@"c:\123.txt");
//在C盘新建123.txt文件,使用流对象fs对文件进行操作,fs可以进行写操作File.OpenWrite()
FileStream fs=File.OpenWrite(@"c:\123.txt");
使用File例:
对文件进行读操作:
//新建fs流对象对象产生的路径是textbox1.text的值,文件的模式是FileMode.OpenOrCreate(可读可写)
using (FileStream fs = File.Open(textBox1.Text,&FileMode.OpenOrCreate)){
//新建字节型数组,数组的长度是fs文件对象的长度(后面用于存放文件)byte[] bt=new byte[fs.Length];
//通过fs对象的Read方法bt得到了fs对象流中的内容fs.Read(bt,0,bt.Length);
//关闭fs流对象fs.Close();
//将bt字节型数组中的数据由Encoding.Default.GetString(bt)方法取出,交给textbox2.texttextBox2.Text = System.Text.Encoding.Default.GetString(bt);}
对文件进行写入操作:
//新建fs流对象,对象操作的文件路径在textbox1.text中,fs的操作模式是FileMode.Create
using (FileStream fs = File.Open(textBox1.Text,&FileMode.Create)){
//新建字节型数组bt对象,bt对象得到了textbox2.text的Encoding的值byte[] bt = System.Text.Encoding.Default.GetBytes(textBox2.Text);
//将bt字节型数组对象的值写入到fs流对象中(文件)fs.Write(bt,0,bt.Length);
//关闭流对象fs.Close();}
对文件的读写操多不管代码有多少,无非就是下面的三步:
1.创建文件读写流对象
2.对文件进行读写
3.关闭文件流
摄像头相关知识
来源网址:&作者:&
WebCamTexture(摄像机开发需要用到的类)
07:08:49&|&&
WebCamTexture类命名空间: UnityEngine继承于: TextureDescription 说明WebCam Textures are textures onto which the live video input is rendered.摄像头纹理是纹理到其上的实时视频输入呈现。Static Variables静态变量devices& &&&返回可用的设备列表。Variables变量deviceName& && && & 将其设置为指定要使用的设备的名称。didUpdateThisFrame& &检查是否为视频缓冲后的最后一帧变化isPlaying& && && && &判断相机是否在播放isReadable& && && && & 判断WebCamTexture是否可读。 (仅适用于iOS的)requestedFPS& && &&&设置相机装置的请求的帧速率(每秒的帧数)requestedHeight& && &设置相机装置的要求高度requestedWidth& && && &设置相机装置的要求宽度videoRotationAngle& && & 返回一个顺时针方向的角度,它可用于旋转的多边形,以便相机内容显示在正确的方位videoVerticallyMirrored&&纹理图像是否垂直翻转Constructors构造函数WebCamTexture&&创建WebCamTextureFunctions功能GetPixel& &&&获取位于坐标(x,y)的像素颜色GetPixels& && && &得到的像素颜色块GetPixels32& &&&获取原始格式的像素数据MarkNonReadable 使WebCamTexture为不可读(无GetPixel*功能将可用(仅IOS))。Pause& && &暂停相机功能play& && && && & 启用stop& && && && &停止Inherited members继承的成员Variables变量hideFlags& &&&如果对象被隐藏,保存在场景或修改用户name& && && &对象的名称。anisoLevel& &&&纹理的各向异性过滤级别filterMode& &&&纹理过滤模式height& && && &像素纹理的高度(只读)mipMapBias& &&&MIP映射纹理偏见width& && && & 像素纹理的宽度 (只读)wrapMode& &&&换行模式的纹理(重复或钳.Functions功能GetInstanceID& && && &返回该对象的实例IDToString& && && &返回游戏对象的名称GetNativeTextureID& &&&检索本地('硬件')处理到纹理GetNativeTexturePtr& &&&检索本机('硬件')处理到纹理.Static Functions静态函数Destroy& && && &删除一个游戏物体,组件DestroyImmediate& &&&立即销毁对象DontDestroyOnLoad& &&&在加载装载一个新的场景时,使该对象的目标不会被自动销毁FindObjectOfType& &&&返回第一个加载的对象的类型。FindObjectsOfType& &&&返回所有加载对象的类型列表。Instantiate& && && &实例化一个对象SetGlobalAnisotropicFilteringLimits& &&&设置各向异性的限制Operators操作运算符bool& && && &真假operator !=& &&&不等于operator ==& &&&等于
&&&&&&&&&&&&&&&&&&&
先调用和先打印书序反了结果也会反;
屏幕坐标转世界坐标(好用)
来源网址:&作者:&
摄像机坐标系:0到1
屏幕坐标是:
unity3d 屏幕坐标、鼠标位置、视口坐标和绘制GUI时使用的坐标
时间& 19:58:00&
unity3d中的屏幕坐标系 是以&屏幕 &左下角为(0,0)点 右上角为(Screen.Width,Screen.Height)
鼠标位置坐标与屏幕坐标系一致
视口坐标是以摄像机为准& 以屏幕的左下角为(0,0)点 右上角为(1,1)点
绘制GUI界面时使用的坐标是以& 屏幕& 的左上角为(0,0)点 右下角为(Screen.width,Screen,Height)
经常会用到 某个物体的世界坐标到屏幕坐标的转化然后再屏幕上绘制出这个物体的代表性图片
是这样做的
1、Vector3 ScreenPos=Camera.WorldToScreenPoint(trans.Position);
2、GUIPos=new Vector3(ScreenPos.x,Screen.height-ScreenPos.y,0);
然后按照这个坐标绘制图片就可以了
网络相关知识
1:引入命名空间 Using system.Net和using System.Net.S
2:服务器代码;
Socket mConn = new Socket(AddressFamily.InterNetWork, SocketType.Stream, &ProtocoType.Tcp);
int Port = 7777;
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, &Port);
mConn.Bind(endpoint);
mConn.Listen(10);
a:同步接收客户端的代码(在当前客户端没有连接之前,不能进行其他操作 只能等着)
while (true)
Socket client = mConn.Accept();
Console.WriteLine("有客户端连接");
b:异步接收客户端代码
mConn.BeginAccept(AcceptClient,mConn)
Console.ReadLine();//(这个方法也是相当于同步方法)保持服务器一直开着,
private static void AcceptClient(IAsyncResult ar)
Console.WriteLine("有客户端连接");
Socket server= ar。AsyncState as S
Socket client = server.EndAccept(ar);
Console.WriteLine(client.RemoteEndPoint);//打印连接的客户端的IP地址
//再次开启异步接收
server.BeginAccept(AcceptCllient,server);
客户端代码:
异步加载场景
1:第一个场景Button上挂载的脚本 要加载滴二哥场景
2:单例类加载管理器
3:Login场景中的脚本
1:分享功能:
第一个脚本:取到Json字符串;
第二个脚本:根据Json字符串的格式定义一个接收Json转换成Object对象的数据结构
马帅的摄像机
DataBaseTool
泛型单例父类
这个单例父类的作用就是当有多个类需要写成单例是,不用重复写单例;
@其他的类继承这个类就可以当做单例使用,例如下例:(注意继承的方式)
关于AudioSource和AudioClip的使用
1:实例一个AudioSource的对象:&&
2:实例化一个AudioClip的对象,并且赋一个值:&&&
类可以继承 结构体不能继承;
类可以继承 &结构体不能继承;
接口和抽象类的区别:接口不能被实现,只能声明
动画插件Itween和dotween
调用MyItween的Test脚本:
关于技能的释放
1;从数据库英雄表取出数据 &用逗号分割,存入string数组;
2:将这些string类型的转成int类型,存入整形数组(容量大小与string类型的数组相同);
3:根据这些id在数据结构里面初始化技能;mskills存储的是技能数据结构,因为这个脚本是在aunit里面 &aunit在人物身上,所以有aunit脚本的就可以调用技能数据。在UIController里面添加对应英雄的aunit脚本就可以调用技能数据;
跨脚本调用方法
如果方法是静态的 就通过类名(脚本名字)调用;
如果方不是静态的:就通过实例化对象 &然后点的方法调用(方法必须是公有的才能点出来)
改变鼠标指针单例脚本,在其他脚本中可以调用
xml写的Transform和Json
Json写的transform:
委托是讲方法作为参数进行传递方法既可以是静态方法,又可以是实例方法
委托的声明圆形如下:
delegate &函数返回类型&&委托名&(&函数参数&)
委托主要用来实现回调:
委托是的使用步骤
属性,数据类型,方法参数
&//get,set也称为属性
*栈区:值类型定义的变量 &压栈,出栈
*堆区:数组,对象
常量区:常量
静态区:Main前面static,字段用static修饰在 静态区
代码区:方法
1;端口:每个端口对应一个服务&
2:新版网络的API:
Unity 网络服务器:NetWorkServer
Leapmotion虚拟现实
1.下载Leapmotion SDK()
2.拖入到场景中
3.找到预设体的HandController拖到场景中 缩放调为10
4.运行游戏 笔记本有摄像头可以实现手部识别
5.核心的脚本就是HandController
步骤:服务器创建一个套接字。2:绑定一个端口 。3:监听 lister4:accept
两种协议:1.TCP(可靠的协议,例如qq)2.UDP(看视频)
Unity网络基本知识
1:网络通信协议
NetWork类创建爱你服务器和客户端:
Unity高通AR解析步骤
来源网址:&作者:&
交流故事,沟通想法
下载简书移动应用
&作者& 17:05*
写了16388字,被87人关注,获得了69个喜欢
Unity高通AR解析(一)
字数852阅读2874评论7喜欢12
在这个生活方式都日新月异的年代,任何的新技术产生都不足为奇,当然本篇所讲的AR(增强现实技术)也并不是最新的技术了,目前市面上已经很多AR方面的硬件设备,当然AR技术也日渐成熟。目前,Unity对AR的支持,只有一家&&高通,原来还有一家Metaio被Apple收购要现在杳无音讯,暂且不提。高通(Qualcomm)是提供Unity插件开发AR产品的AR公司。本篇我们就来用高通的插件,来开发一个UnityAR小程序。
注册高通账号,获取许可证,注册识别图
由于高通的AR技术是不开源的,所以使用的时候还需要注册许可证号。首先,我们登录高通。
高通AR官网
注册界面1(密码中字母要有大写有小写)
登录到高通
注册许可证
注册许可证
填写项目名称
完成许可证注册
查看注册好了的许可证
获取许可证号
获取许可证号,暂时保存起来,一会儿会用到
注册识别图数据库
注册识别图数据库
创建数据库
打开数据库创建识别图
添加识别图
添加识别图成功
选择Unity Editor,下载
下载好了的Package
准备就绪,开始Unity开发
创建工程,导入资源(本例使用Unity5.0.2)
导入高通插件和刚刚生成的Logo包
找到ARCamera预设体和TargetImage预设体,导入场景
删除MainCamera
ARCamera属性介绍
VuforiaBehaviour
1.AppLicenseKey//App许可证号码
2.CameraDeviceMode//摄像机设备模式
MODE_DEFAULT = -1,//默认(默认)
MODE_OPTIMIZE_SPEED = -2,//速度优化
MODE_OPTIMIZE_QUALITY = -3//质量优化
3.Max Simultaneous Tracked Images//最大跟踪图片数量
4.Max Simultaneous Tracked Objects//最大跟踪对象数量
5.Delayed Loading Object Data Sets//延迟加载对象数据集
6.Camera Direction//摄像机方向
CAMERA_DEFAULT,//默认(默认)
CAMERA_BACK,//后面
CAMERA_FRONT//前面
7.Mirror Video Background//镜像视频背景
DEFAULT,//默认(默认)
8.World Center Mode//全球中心模式
SPECIFIC_TARGET,//特定的目标
FIRST_TARGET,//第一个目标
CAMERA//摄像机(默认)
9.Bind Alternate Camera//绑定替代相机
我们需要的设置
复制许可证号
写入许可证号
ImageTarget属性介绍
ImageTarget属性介绍
1.Type类型
PREDEFINED,//预定义的(默认)
USER_DEFINED,//用户定义的
CLOUD_RECO//云侦察的
2.Data Set//数据集
3.Image Target//目标识别图
4.Width//宽度
5.Height//高度
6.preserve child size//保存子对象大小
7.Extended Tracking//跟踪拓展
8.Smart Terrain//智能地形
我们需要的设置
选择数据库和识别图
找一个识别后显示的模型,放置为ImageTarget的子物体
设置摄像机位置,调整模型缩放
我的iOS9.1,还没来得及下Xcode7.1,暂时这样测试
本篇主要实现基本的AR显示,后续还会写后面的高级实现,敬请期待。
著作权归作者所有
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
分享到微博
&分享到腾讯微博
&分享到QQ空间
&分享到Twitter
&分享到Facebook
&分享到Google+
&分享到豆瓣
打开微信&扫一扫&,打开网页后点击屏幕右上角分享按钮
www的属性:texture(下载的图片) audioclip(下载的声音) movie(下载的视频) bytes(下载的二进制,把文件以二进制的形式存储下来) &text isdone (是否下载完成 )progress(下载的进度) URL(下载的地址)
整个代码所有名字为www的变量名字的改变:点击程序中任意一个变量名,然后右键重命名 这样改一个就可以,程序中所有其他的都会改变;
携程的使用方法:
注意:携程的方法需要把void换成IEnumerator &然后在Start里面用startCoroutine()开启携程(该方法里面是携程的"方法名字&或者如下所示)
&void&Start()
&&&&&&& StartCoroutine(DownLoadMovia());
&&&&public&IEnumerator&DownLoadMovia()
&&&&&&&&string&url =&"http://172.18.21.77/aaa.mp4";
&&&&&&&&WWW&www =&new&WWW(url);
&&&&&&&&yield&return&
携程的方法:StartCoroutine(方法);
& & & & & & & & & & StopCoroutine(方法);
& & & & & & & & & & Yield return WaitForSeconds(float f);//过f秒再执行后面的代码;
& & & & & & & & & & &yield return StarCoroutine(otherIEnumerator());//等到括号里面的携程执行完毕后 在执行本句后面的代码;
携程的执行顺序 &在Update和LateUpdate之间;
数据库 发布到安卓:
两个路径1.当前工程数据库文件的位置
& & & & & & & &2安卓手机上程序的安装位置(因为;安卓里没有数据库文件。解决方案:放一个数据库文件进来);
将数据库文件放置到安卓手机程序的安装位置;1
1: 解析安装包apk & 拿到数据库文件 &然后放置到安卓手机程序的安装位置
两个语法:
1:安装包apk路径语法 &jar
2:安卓数据库链接字符串语法 url
发布到安卓的具体方法:
数据库登录界面
using&UnityE
using&System.C
using&Mono.Data.S
using&UnityEngine.UI;
public&class&InputCheck&:&MonoBehaviour&{
&&&&public&InputField&
&&&&&&&&// Use this for initialization
&&&&&&&&void&Start () {
&&&&&&&&// Update is called once per frame
&&&&&&&&void&Update () {
&&&&public&void&CheckUserName()
&&&&&&&&string&datapath =&"Data Source="&+&Application&.streamingAssetsPath +&"/UserDatabase.sqlite"&;
&&&&&&&&SqliteConnection&userconnect =&new&SqliteConnection&(datapath);
&&&&&&& userconnect.Open();
&&&&&&&&SqliteCommand&usercommand = userconnect.CreateCommand();
&&&&&&&&string&userstring = transform.GetComponent&&InputField&().
&&&&&&& mandText =&"select * from UserTable";
&&&&&&&SqliteDataReader& username = usercommand.ExecuteReader();
&&&&&&&&while&(username.Read())
&&&&&&&&&&&&for&(&int&i = 0; i & username.FieldC i++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&&&//返回值为object
&&&&&&&&&&&&&&&&//如果账号正确
&&&&&&&&&&&&&&&&if&(username.GetValue(i).ToString() == userstring)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&//判断密码是否正确
&&&&&&&&&&&&&&&&&&&&&&&&if&(username.GetValue(1).ToString() == passwordtext.text)
&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&Debug.Log(&"登录成功"&);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&//密码不正确&
&&&&&&&&&&&&&&&&&&&&Debug.Log(&"密码错误"&);&&&&&&
&&&&&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&Debug.Log(&"账号不存在"&);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
数据库字符串类型的要用单引号引起来例如:'sadfas'
username.GetValue(i);返回值为object类型:
xml的生成与解析:
1:xml的生成:(引入命名空间using System.Xml:xml的生成与解析都用这一个就行)
&&&//生成xml文件
&&&&public&void&creatXML()
&&&&&&&&//生成xml文件的名称以及路径
&&&&&&&&string&filepath =&Application.dataPath +&"/Resources/XMLFile1.xml"&;
&&&&&&&&//创建一个xml文档操作对象
&&&&&&&&XmlDocument&doc =&new&XmlDocument&();
&&&&&&&&//创建一个xml文档头
&&&&&&&XmlDeclaration&declaration = doc.CreateXmlDeclaration(&"1.0",&"UTF-8"&,&null);
&&&&&&&&//将xml文档头添加到文档操作对象doc中
&&&&&&& doc.AppendChild(declaration);
&&&&&&&&//doc.Save(filepath);
&&&&&&&&//创建子节点
&&&&&&&&//1.创建一个根节点
&&&&&&&&XmlElement&root = doc.CreateElement("Scene"&);
&&&&&&&&//2.将根节点添加到文档中
&&&&&&& doc.AppendChild(root);
&&&&&&&&//在根节点下添加一个子节点
&&&&&&&&XmlElement&child1 = doc.CreateElement("GameObject"&);
&&&&&&&&//添加给root
&&&&&&& root.AppendChild(child1);
&&&&&&&&//添加属性
&&&&&&&&XmlAttribute&attr1 = doc.CreateAttribute("Name"&);
&&&&&&& attr1.Value =&"Cube";
&&&&&&& child1.SetAttributeNode(attr1);
&&&&&&& child1.SetAttribute(&"sex",&"man"&);
&&&&&&& child1.SetAttribute(&"Layer",&"Water"&);
&&&&&&& child1.SetAttribute(&"Tag",&"宁"&);
&&&&&&&&//为GameObject添加子节点
&&&&&&&&XmlElement&child1_transform = doc.CreateElement("Transform"&);
&&&&&&& child1.AppendChild(child1_transform);
&&&&&&&&//位Transform添加三个子节点x,y,z
&&&&&&&&XmlElement&child2_position = doc.CreateElement("Position"&);
&&&&&&& child1_transform.AppendChild(child2_position);
&&&&&&& child2_position.SetAttribute(&"x",&"1"&);
&&&&&&& child2_position.SetAttribute(&"y",&"2"&);
&&&&&&& child2_position.SetAttribute(&"z",&"3"&);
&&&&&&& doc.Save(filepath);
生成的结果:
&?xml&version="1.0"&encoding&="&UTF-8"&?&
& &GameObject&Name="Cube"&sex&="&man"&Layer=&"Water&"&Tag="宁"&&
&&& &&Transform&
&&&&& &&Position&x&="&1"&y=&"2&"&z="3"&/&
&&& &/&Transform&
& &/GameObject&
2:xml的解析:
&//解析xml文档(其实就是SelectSingleNode函数)
&&&&//public void readxml()
&&&&//&&& //实例化一个xml文档操作类
&&&&//&&& XmlDocument doc = new XmlDocument();
&&&&//&&& string xmlfilepath = Application.dataPath + "/Resources/XMLFile1.xml";
&&&&//&&& //doc.Load(xmlfilepath);
&&&&//&&& //获取元素的根节点
&&&&//&& XmlElement root = doc.DocumentE
&&&&//&&& //Debug.Log(root.Name);
&&&&//&&& //筛选节点
&&&&//& XmlNode node1 = root.SelectSingleNode("GameObject");
&&&&//&&& //sDebug.Log(node1.Name);
&&&&//&&& XmlAttributeCollection attributes = node1.A
&&&&//&&& foreach (var item in attributes)
&&&&//&&& {
&&&&//&&&&&&& XmlAttribute att = (XmlAttribute)
&&&&//&&&&&&& Debug.Log(att.Name +":"+ att.Value);
&&&&//&&& }
&&&&//&&& XmlNode node1_transform = node1.SelectSingleNode("Transform");
&&&&//&&& Debug.Log(node1_transform.Name);
&&&&//&&& //解析剩下的节点
&&&&// XmlNode xnode = node1_transform.SelectSingleNode("x");
&&&&//&&& XmlNode ynode = node1_transform.SelectSingleNode("y");
&&&&//&&& //获取x节点下的文本内容
&&&&//&&& Debug.Log(xnode.OuterXml);
&&&&//&&& Debug.Log(ynode.InnerText);
要想显示汉字必须把文件(例如text)格式改为UTF-8的形式;
Json数据生产:
using&UnityE
using&System.C
using&System.J//引入命名空间
public&class&jeson&:&MonoBehaviour&{
&public&void&CreatJsonstr()
&&&&&&&&//生成一个Json对象
&&&&&&&&JsonObject&root =&new&JsonObject&();
&&&&&&& root.Add(&"HeroName",&"诺克萨斯之手"&);
&&&&&&& root.Add(&"HP",&"58.6f"&);
&&&&&&&&JsonObject&skill1 =&new&JsonObject&();
&&&&&&& skill1.Add(&"skillname",&"chuxue"&);
&&&&&&& skill1.Add(&"skilltype",&"Passive"&);
&&&&&&& skill1.Add(&"xiaohao",&"9/8/7/6"&);
&&&&&&&&JsonObject&skill2 =&new&JsonObject&();
&&&&&&& skill2.Add(&"adf",&"afdf"&);
&&&&&&& skill2.Add(&"sdafa",&"iui"&);
&&&&&&& skill2.Add(&"aufhuds",&"asdfy"&);
&&&&&&&&JsonArray&cd =&new&JsonArray();
&&&&&&& cd.Add(skill1);
&&&&&&& cd.Add(skill2);
&&&&&&& root.Add(&"技能",cd);
&&&&&&string&str =&& root.ToString();
&&&&&&&&Debug.Log(root);
第二种:(不理解)
&&&&JsonObject&
&&&&&&&&// Use this for initialization
&&&&&&&&void&Start () {
&&&&&&&&//创建一个json对象
&&&&&&& jo =&new&JsonObject();//相当于写好了一个大括号
&&&&&&&&//设置一个json值
&&&&&&&JsonValue&jv =&"10";//int& float& string
&&&&&&&&//json对象添加键值对
&&&&&&& jo.Add(&"name", jv);
&&&&&&&&Debug.Log(jo.ToString());
&&&&&&&&//创建一个json数组
&&&&&&&&JsonValue[] sons =&new&JsonValue[] {&"masterwang",&"oldwang"&};
&&&&&&&&//实例化一个json数组
&&&&&&&&JsonArray&arr =&new&JsonArray(sons);
&&&&&&&&//json对象添加对象数组
&&&&&&& jo.Add(&"sons", arr);
&&&&&&&&//debug.log(jo.tostring());
&&&&&&& HandOfLittleStudent();
&&&&void&HandOfLittleStudent()
&&&&&&&&//创建技能q的Json对象
&&&&&&&&JsonObject&skillq =&new&JsonObject&();
&&&&&&&&//添加一个技能名称
&&&&&&& skillq.Add(&"Q",&"大厦四方"&);
&&&&&&&&//创建一个数组对象
&&&&&&&&JsonArray&cd =&new&JsonArray(&new&JsonValue[] { 9, 8, 7, 6, 5 });
&&&&&&& skillq.Add(&"冷却时间"&,cd);
&&&&&&& skillq.Add(&"消耗法力"&, 30);
&&&&&&& skillq.Add(&"jo", jo);
&&&&&&&&Debug.Log(skillq);
Json数据解析:
using&UnityE
using&System.C
using&LitJ//引入解析明明空间
public&class&litjjjson&:&MonoBehaviour&{
&&&&&&&&void&Start ()
&&&&&&& ParJson();
&&&&public&void&ParJson()
//解析第一个文本
TextAsset&jsonfile1 =&Resources&.Load("transformtext"&)&as&TextAsset&;
&&&&&&&&string&jsonstr1 = jsonfile1.
&&&&&&&&JsonData&date1 =&JsonMapper.ToObject(jsonstr1);
&&&&&&&&Debug.Log(date1[2][&"y"]);
//解析第二个文本;
&&&&&&&&//加载文件到text
&&&&&&&&TextAsset&jsonfile =&Resources.Load(&"Json")&as&TextAsset&;
&&&&&&&&string&jsonstr = jsonfile.
& & & &//将text转换成对象的格式
&&&&&&&&JsonData&date =&JsonMapper.ToObject(jsonstr);
& & & &//输出skills对象第2个的技能名字
&&&&&&&&Debug.Log(date[&"skills"][1]["skillName"&]);
//如何保存成为一个Json文件
1:粒子系统
2:拖尾渲染
3:线性渲染
4:贴图融合
1.粒子系统:粒子系统其实就是一个组件:Particle System。
Particle System组件面板如下:
using&UnityE
using&System.C
using&UnityEngine.UI;
public&class&PlayerprefabsTest&:&MonoBehaviour&{
&&&&///&&summary&
&&&&///&本地数据的存储测试
&&&&///&&/summary&
&&&&&&&&// Use this for initialization
&&&&public&InputField&L
&&&&public&InputField&S
&&&&public&InputField&N
&&&&&&&&void&Start ()
&&&&&&&&//Debug.Log(PlayerPrefs.GetInt("Leval"));
&&&&&&&&//Leval.text = PlayerPrefs.GetInt("Leval").ToString();
&&&&&&&&//Score.text = PlayerPrefs.GetFloat("Score").ToString();
&&&&&&&&//Name.text = PlayerPrefs.GetString("姓名");
&&&&&&&&// Update is called once per frame
&&&&&&&&void&Update () {
&&&&public&void&savedate()
&&&&&&&&PlayerPrefs.SetInt("Leval"&, 30);
&&&&&&&&PlayerPrefs.SetFloat("Score"&, 153.6f);
&&&&&&&&PlayerPrefs.SetString("姓名"&,"张大鸡复活节第三zhang"&);
&&&&public&void&ReadDate()
&&&&&&&&string&rank =&PlayerPrefs.GetInt("Leval"&).ToString();
&&&&&&&&float&score =&PlayerPrefs.GetFloat("Score"&);
&&&&&&&&string&name =&PlayerPrefs.GetString("姓名"&);
&&&&&&& Leval.text =
&&&&&&& Score.text = score.ToString();
&&&&&&& Name.text =
&&&&public&void&clearall()
&&&&&&&&PlayerPrefs.DeleteAll();
PlayerPrefaebs 小型游戏可以用:
PlayerPrefaebs &小型游戏可以用:
1:粒子系统
2:拖尾渲染:Trail Render
3:线性渲染:Line Render
4:贴图融合
1.粒子系统:粒子系统其实就是一个组件:Particle System。
Particle System组件面板如下:
线性渲染:
贴图融合:例如制作弹痕效果 :
1:将想要烘焙的场景里的物体选中 &然后Static里面选中NavigationStatic(导航静态);
NavMeshAgent组件的属性,方法:
NavMeshAgent &
float dis = nav.remainingD
float &sdis = nav.StoppingD
nav.updatePosition=那么游戏对象的坐标固定不变;
nav.updateRotation=那么游戏对象的旋转固定不变:
nav.Stop();//停止导航
首先在Windows窗口添加一个Navigation &在该面板设置相应的参数;
注意:上图左侧选中环境里需要烘焙的物体,右侧Object面板要选中Navigation Static(打上对勾);
Bake界面:设置相应的参数;
游戏主角:添Nav Mesh Agent组件,这个组件是用来导航的 添加了这个组件才可以调用他的函数,比如setdestination等封装好的函数,如下图;
Area Mask组件:可以选择让组件挂在的游戏对象选择走那些路 &不走哪些路;(分层);
分离路面导航:
分离路面导航在组件:Off Mesh Link
组件的使用方法:在两个点上的一个挂上该组件就行,然后将两个物体拖进组件中;(该组件不是放在游戏主角上,而是放在环境物体身上);
分层烘焙路面:
下图中Cost的值越小 &优先级越高,相同条件下,主角会从该层行走。
在object面板设置层:如下图
主角设置为Walkbale 代表所有的层都可以走,
环境信息设置为另一个层 比如road1 (有一个Cost值 代表了该层的优先级);
除了手动选择层外,还可以用代码实现:如下
动态障碍:
动态障碍功能实现的组件:Nav Mesh Obstcal,
面板如下层:
关于射线的笔记
&RaycastHit&
&Ray&hit =&Camera.main.ScreenPointToRay(&Input.mousePosition);
&Physics.Raycast(hit,&out&rrr);
上述代码可以得到鼠标点击点的信息,rrr.point是一种position类型;
Mask:遮罩 &在JumpLayer加avator Mask (设置一下),权重weight 要设置为1;
IK Pass 勾上代表可以使用IK;
Avatar Mask组件;
IK动画的使用:
1:只有人型动画才能设置IK;
1:里面的权重(1f)表示任务抬手动作的大小,0代表不抬手,1代表完全指向目标:
2:将手指向,转向rightHandObj对象;(与lookat很相似);
3:如果没有rightHandobj这个对象,则手不进行任何操作;
动画曲线:如果动画曲线叫Curve(如下图),那么在parameter面板加一个同样名字的Float变量(这个变量的值随着图Curve的变化而变,大小一样),在脚本里利用GetFloat方法获取曲线的y值进行利用;
动画事件:Event;
下图是在Idle Walk 等动画里设置的 不是人物里面设置的;
注意:下图Object参数必须是一个预设体:
脚本必须放在人物身上,不是动画身上;
动画系统一
一:mecanim动画系统:]
1:任性动画设置和重用;
2:动画剪辑设置
3;可视化动画控制界面
4:动画播放的精准控制
动画类型:无任何动画 &legacy 旧版动画 Generic 一般动画(非人性动画) Humanoid 人形动画
人性动画设置:
测试骨骼:肌肉测试
点击Done 回到正常界面
点击Import 如果现实下面的内容说明该模型没有动画;
模型没有动画的时候:Animations面板
模型有动画时的Animations面板:
把模型所包含的动画剪辑成的片段:点击+号可以添加剪辑片段-好可以删除选中的片段
动画剪辑面板:
动画编辑:
loop Time &让动画循环执行:
Loop Pose 让动画起始帧和末尾帧衔接更加自然,动画更加流畅;
Cycle Offset 设置动画开始执行的帧位置:
Loop Match &红色代表动画不能播放;黄色不能顺畅的播放;绿色可以;
Bake Into pose;烘焙进姿势:只有动作(例如动画有旋转的动作,但是坐标不改变,线面两个位移也是一样) 没有位移:
注意上面的Cycle Offset 和下面的Offset是不一样的 下面代表的是位置的便宜 &上面代表的是动画整形循环的开始的帧位置:
mirror:当前动画是按照原动画执行动作,还是镜像里的动画执行动作:
Animator组件:
Controller:动画控制器
Avator:人物骨骼(阿凡达);
Apply Root motion :只有勾选上,在动画设置里的改动才能应用,否则用的是原版动画,所有更改都没用啦;
Culling Mode :时间缩放;
Update:动画显示更新模式;
二State Machine状态机:
三:Blend Tree:融合树:
动画系统一
一:mecanim动画系统:]
1:任性动画设置和重用;
2:动画剪辑设置
3;可视化动画控制界面
4:动画播放的精准控制
动画类型:无任何动画 &legacy 旧版动画 Generic 一般动画(非人性动画) Humanoid 人形动画
人性动画设置:
测试骨骼:肌肉测试
点击Done 回到正常界面
点击Import 如果现实下面的内容说明该模型没有动画;
模型没有动画的时候:Animations面板
模型有动画时的Animations面板:
把模型所包含的动画剪辑成的片段:点击+号可以添加剪辑片段-好可以删除选中的片段
动画剪辑面板:
动画编辑:
loop Time &让动画循环执行:
Loop Pose 让动画起始帧和末尾帧衔接更加自然,动画更加流畅;
Cycle Offset 设置动画开始执行的帧位置:
Loop Match &红色代表动画不能播放;黄色不能顺畅的播放;绿色可以;
Bake Into pose;烘焙进姿势:只有动作(例如动画有旋转的动作,但是坐标不改变,线面两个位移也是一样) 没有位移:
注意上面的Cycle Offset 和下面的Offset是不一样的 下面代表的是位置的便宜 &上面代表的是动画整形循环的开始的帧位置:
mirror:当前动画是按照原动画执行动作,还是镜像里的动画执行动作:
Animator组件:
Controller:动画控制器
Avator:人物骨骼(阿凡达);
Apply Root motion :只有勾选上,在动画设置里的改动才能应用,否则用的是原版动画,所有更改都没用啦;
二State Machine状态机:
三:Blend Tree:融合树:
动画的遮罩
状态机做两个层 &在第二个层里加上AAnimatorMask 并且把他的Weight设置为1,两个层的页面如下:
另一层:正常状态不是Idle &而是New State(空状态)
单例的缺点:没有继承各种类和MoNo;unity的封装方法没办法用,部分可以使用(gameobject,tansform)如果用到了MONO的方法会异常处理(一些重要的代码用到,尤其是用户交互);
单利类不放在任何组件对象身上,但是单利脚本(继承mono)必须放在对象身上;
publicclassSImpple
&&&&private&SImpple()
&&&&private&static&SImpple&_
&&&&public&static&SImpple&getinstanse()
&&&&&&&&if&(_instanse ==&null)
&&&&&&&&&&& _instanse =&new&SImpple();
&&&&&&&&&&&&return&_
单利脚本的缺点,在切换场景的时候容易被销毁(解决办法:使用DontDestroyThis()方法防止单例脚本被销毁);
using&UnityE
using&System.C
public&class&SingleScript&:&MonoBehaviour
&&&&public&static&SingleScript&_
&&&&void&Awake()
&&&&&&& _instance =&this;
单例的缺点:没有继承各种类和MoNo;unity的封装方法没办法用,部分可以使用(gameobject,tansform)如果用到了MONO的方法会异常处理(一些重要的代码用到,尤其是用户交互);
单利类不放在任何组件对象身上,但是单利脚本(继承mono)必须放在对象身上;
publicclassSImpple
&&&&private&SImpple()
&&&&private&static&SImpple&_
&&&&public&static&SImpple&getinstanse()
&&&&&&&&if&(_instanse ==&null)
&&&&&&&&&&& _instanse =&new&SImpple();
&&&&&&&&&&&&return&_
using&UnityE
using&System.C
public&class&SingleScript&:&MonoBehaviour
&&&&public&static&SingleScript&_
&&&&void&Awake()
&&&&&&& _instance =&this;
EventSystem
一:添加 Event Trriger组件 &不用写代码;
二:写代码如下:注意引入事件系统;实现接口继承
三:实现UI明明空间;(看start里面的方法,不能写在Update里面,只注册一次就行),需要给脚本托一个脚本组件;
using&UnityE
using&System.C
using&UnityEngine.EventS
using&UnityEngine.UI;
public&class&EventSystomText&:&MonoBehaviour,IPointerEnterHandler&,IPointerExitHandler&,IPointerDownHandler&,IPointerUpHandler&,IPointerClickHandler&,IBeginDragHandler&,IDragHandler&,IEndDragHandler&,
//第三种方法的代码
&&&&public&Button&
&&&&public&void&OnBeginDrag(&PointerEventData&eventData)
&&&&&&&&Debug.Log(&"开始拖拽"&);
&&&&&&&&//throw new NotImplementedException();
&&&&public&void&OnDrag(PointerEventData&eventData)
&&&&&&&&Debug.Log(&"正在拖拽"&);
&&&&&&&&//throw new NotImplementedException();
&&&&public&void&OnEndDrag(&PointerEventData&eventData)
&&&&&&&&Debug.Log(&"结束拖拽"&);
&&&&&&&&//throw new NotImplementedException();
&&&&public&void&OnPointerClick(&PointerEventData&eventData)
&&&&&&&&Debug.Log(&"鼠标点击"&);
&&&&&&&// throw new NotImplementedException();
&&&&public&void&OnPointerDown(&PointerEventData&eventData)
&&&&&&&&Debug.Log(&"鼠标按下"&);
&&&&&&&&//throw new NotImplementedException();
&&&&public&void&OnPointerEnter(&PointerEventData&eventData)
&&&&&&&&Debug.Log(&"shubiaojinre");
&&&&&&&// throw new NotImplementedException();
&&&&public&void&OnPointerExit(&PointerEventData&eventData)
&&&&&&&&Debug.Log(&"鼠标离开"&);
&&&&&&&&//throw new NotImplementedException();
&&&&public&void&OnPointerUp(&PointerEventData&eventData)
&&&&&&&&Debug.Log(&"鼠标抬起"&);
&&&&&&&// throw new NotImplementedException();
//第三种方法的代码
&&&&public&void&Res()
&&&&// Use this for initialization
&&&&void&Start () {
//只执行一次就行
&&&&&&& btn.onClick.AddListener(Res);
&&&&&&&&// Update is called once per frame
&&&&&&&&void&Update () {
场景的加载
& & & &//1.读取新的关卡后立即切换,其参数为所读取的新关卡的名称或索引;
&&&&&&&&Application.LoadLevel("your scene"&);
&&&&&&&&//2.加载一个新的场景,当前场景不会被销毁。
&&&&&&&&Application.LoadLevelAdditive("Your scene"&);
&&&&&&&&//异步加载场景
&&&&&&&&//1.加载完进入新场景销毁之前场景
&&&&&&&&Application.LoadLevelAsync("Your Scene"&);
&&&&&&&&//2.加载完毕进入新场景但是不销毁之前场景的游戏对象
&&&&&&&&Application.LoadLevelAdditiveAsync("Your Scene"&);
Application(应用程序)
作用:1.加载游戏关卡场景
& & & & & 2.获取资源文件路径
& & & & & 3.退出当前游戏场景
& & & & & 4.获取当前游戏平台
& & & & & 5.获取数据文件夹路径
Application.Plateform &返回值为当前程序运行所在的平台;
&Debug.Log(Application.runInBackground);可读可写,返回程序是否在后台运行的布尔值:
Application类的测试:
&&&&void&Start()
&&&&&&&&//打印在哪个平台运行
&&&&&&&&Debug.Log(&Application.platform);
&&&&&&&&//返回是否在后台运行(bool值)
&&&&&&&&Debug.Log(&Application.runInBackground);
&&&&&&&&//当前工程的Assets文件夹位置(仅编辑器有);
&&&&&&&&Debug.Log(&Application.dataPath);
&&&&&&&&//持久路径
&&&&&&&&Debug.Log(&Application.persistentDataPath);
&&&&&&&&//数据流路径
&&&&&&&&Debug.Log(&Application.streamingAssetsPath);
&&&&&&&&//返回当前场景的索引号
&&&&&&&&Debug.Log(&Application.loadedLevel);
输出结果:
坦克转向鼠标的位置
鼠标的位置转换成世界坐标: Vector3 WorldPoint =Camera.main.screenToWorldPoint(mousePoint);
Vector3 direction =worldPoint -mGunTransform.
mGunTransform.rotation=Quternion.LookRotation(Vector3.forword,direction)
实现小地图的方法
在已经创建好的ui界面:首先议案家一个摄像机,然后将主摄像机的层级设置为1(大于新添加的摄像机),在创建一个Render Texture组件,创建一个RawImage组件,将该组件的北京图片换为刚才创建的Render Texture即可;
如果小地图里面物体的移动方向与主场景中的不一致,可以在sence里面调整新添加的相机的视角;
怎样实现小地图摄像机跟随某个物体移动:把小地图摄像机设置为想要跟随的目标的子物体就行:
实现小地图不显示实际的任务,只显示人物头像(类似lol小地图):添加一个Canvas(Render Mode设置成世界模式(World Space),Event Camera设置成小地图的相机(渲染的时候将人物层剔除掉,主相机则是将人物头像(新建一个层,不能是原来的ui层)层剔除掉),将人物头像与任务xz坐标调成一致,)
1.添加一个RawImage组件,背景图片选一张你想要显示的形状的无色的图片,在该组件上再添加一个Mask组件,将要显示的通篇放到该RawImage组件上;
血条,头像
遮罩:在父物体上添加Mask,在给其添加一个形状,在添加一个子物体图片,子物体的图片就会随着形状的改变而改变;
Image组件:Image Type 可以做不同的功能;
1,2D游戏相机设置为正交相机 size:5
2.资源切图
3.游戏背景设置成:在game视图中设置为Free A(自适应屏幕大小)
4.预制体的创建:炮口,炮弹,鱼;
2D动画的创建
选中切割好的图片,全部选中拖到Hierirychy面板中,给个动画名字,然后直接播放即可,也可以拖成预制体,
世界坐标与本地坐标的转换
将屏幕左边转换成世界坐标;transform.postion = Camera.main.ViewportToWorldpoint(Input.mouseposition);
& & & & & & & & & & & & & & & & & & & & &
&transform.position =&Camera.main.ViewportToWorldPoint(&new&Vector3(Input&.mousePosition.x /&Screen.width,&Input.mousePosition.y /&Screen.height, 4));
2D图片处理
如果不在工程设置里Edtor更改设置(DisAble,Enable forbuildings,Always Enable),那么系统会自动打包图片(即讲多张图片放到一张图片中)。
从一张打包好的图片里切割出小图片的好处:降低 CPU 的 DrawCall &切割出来的图片都算作一次Drawcall;
处理修改图片的组件:Sprite Renderer;
快速进入API:点击组件右侧的小问号。
1.碰撞器的大小可以人为地改变,来适应需求;
2.碰撞器的类型:胶囊体碰撞器,圆形碰撞器(2D)
3.OnCollisionEnter等回调方法需要有刚体;
4.GetComponent&MeshRenderer&().material.color=Color.red=new Color(255,0,0);两种方式是等价的; & & & & 可以改变物体的颜色;
对游戏对象的测速
1.两个触发器:一个触发器检测到车的触发器后继而拿到其刚体组件继而拿到其速度:
Transform类
静态类:Time.time &游戏从开始到现在运行的时间;
Vector3是一个结构体,常用属性:vector3.normalied:标准化向量 方向不变,长度为1;
& & & & & & & & & & & & & & & & & &vector3.magnitude &向量的长度(只读);
& & & & & & & & & & & & & & & & & &vector3.sqrMagnitude:向量长度平方(只读);
& & & & & & & & & & & & & & & & & & 常用方法:vector3.Normalied():标准化向量,长度为1
& & & & & & & & & & & & & & & & & & & & & & & & & & static float Angle(Vector3 from,vector3 to);两向量之间的角度
& & & & & & & & & & & & & & & & & & & & & & & & & & static float Distance(Vector a,Vector3 b);两点之间的距离
transform.rotation = Quaternion.look(vector3.left,vector.up);
子弹飞行:子弹上的脚本Update里:
&transform.Translate(Vector3.forward*&Time.deltaTime*speed);
设置父对象:bullet.transform.parent=parent.===bullet.transform.setparent(parent.transform);
通过设置Transform父子关系可以在敌人指定的部位产生爆炸流血特效;
float v =Input.Getaxis("Horizontal"); &v是一个0到1之间的值
物体自转的公式;
transform.Rotate(transform.up *&Time.deltaTime * Rspeed*hor);
7.13笔记 unity组件
一个游戏物体身上有很多的组件:
销毁游戏对象的两种方式:1,Destroy();继承MonoBehavior类
transform.Translate(vector3.up);改变的是本地坐标。
transform.position+=vector3.改变的是世界坐标。
transform.Rotate(vector3.up);
translate.RotateArround(new Vector3(0,0,0),Vector3.up,10(旋转角度,并不是速度。但是放到Update每秒执行多少次,其值的大小就可以代表速度啦));
transform.LookAt(Target.Transform);让当前脚本挂载的物体朝向目标但是不移动;
Target.transform.localscale=new vector(2,2,2); & 改变Target的缩放。
关于射线的知识点
Debug.Draw()方法是持续执行的必须放在update()里面才能看到划线,而且只能在Scene里面才能看到在Game视图看不到;
代码如下:
public&class&CameraRay&:&MonoBehaviour
&&&&RaycastHit&H
&&&&void&Start()
&&&&&&&&bool&isRaycast =&Physics.Raycast(&new&Vector3(0, 1, 0),&Vector3.down,&out&Hit);
&&&&&&&&if&(isRaycast)
&&&&&&&&&&&&Debug.Log(Hit.point);
&&&&void&Update()
&&&&&&&&Debug.DrawLine(&new&Vector3(0, 10, 0), Hit.point,&Color.red);
关于物体的移动
如果想让物体的速度由快到慢:就用lerp函数:transform.position=vector3.Lerp(transform.position,Target,Time.delTime);
第二种移动方法: & & &float hor= Input.GetAxis("Horizontal");
& & & & & & & & & & & & & & & & float ver = Input.GetAxis("Vertical");
& & & & & & & & & & & & & & & & transform.position +=new Vector3(hor,ver,0)*Time.delT
第二种方法的第二种写法: & & &float&hor =&Input&.GetAxis("Horizontal"&);
& & & & & & & & & & & & & transform.position += transform.right * hor *&Time.deltaTime *
寻找当前脚本挂在物体的子物体
point= transform.Find("Gun/Point");
纹理和材质球一般是配合使用的;想要变得更逼真,就把贴图变成map的
纹理和材质球一般是配合使用的;想要变得更逼真,就把贴图变成map的
射线的创建
鼠标拖拽物体
using&UnityE
using&System.C
public&class&Script1&:&MonoBehaviour
&&&&public&float&
&&&&private&Vector3&PresentP
&&&&private&Vector3&CurrentP
&&&&void&OnMouseDown()
&&&&&&& PresentPosition=&Input.mouseP
&&&&void&OnMouseDrag()
&&&&&&& CurrentPosition =&Input.mouseP
&&&&&&&&Vector3&dir = CurrentPosition - PresentP
&&&&&&& transform.position += dir*
&&&&&&& PresentPosition = CurrentP
&&&&void&Update()
&&&&&&& OnMouseDown();
&&&&&&& OnMouseDrag();
10抽象类,静态类
& & & &&&&
枚举,结构体
结构体数组结合
找最大最小值,先定义一个max,与max比较,一次循环
排序,冒泡,两次循环,i&length-1,j&length-1-i,
按年龄排序,要交换整个Student 类型的
&int c = char.Parse(Console.ReadLine());
& & & & &&&PlayerStatus player = (PlayerStatus)c;
&&&&&&&&&&&&PlayerStatus&player = (PlayerStatus&)char.Parse(&Console&.ReadLine());
&&&&&&&&&&&&Console&.WriteLine(player);
字符串,重载,递归
字符串&&&& &&
&&//string str = "lanou,keji,hello/world$bie";
&&&&&&&&&&& //string str1 =
&&&&&&&&&&& //str1 = "keji";
&&&&&&&&&&& //Console.WriteLine(str+str1);
检测字符串中是否包含指定的字符串
&&&&&&&&&&& //bool b = str.Contains('a');
&&&&&&&&&&& //Console.WriteLine(b);
返回字符串中首次出现指定字符的下标位置
&&&&&&&&&&& //int i = str.IndexOf('l');
&&&&&&&&&&& //Console.WriteLine(i);
返回字符串中最后次出现指定字符的下标位置
&&&&&&&&&&& //int j = str.LastIndexOf('l');
&&&&&&&&&&& //Console.WriteLine(j);
&&&&&&&&&&& //string str1 = str.PadLeft(30);
& & & & & & //Console.WriteLine(str1);
&&&&&&&&&&& //string str2 = str.PadRight(30);
&&&&&&&&&&& //Console.WriteLine(str2);
从指定下标位置删除后面的字符串
&&&&&&&&&&& //string str3 = str.Remove(10, 5);
&&&&&&&&&&& //Console.WriteLine(str3);
替换指定子字符或字符串
&&&&&&&&&&& //string str4 = str.Replace("bei", "beijing");
&&&&&&&&&&& //Console.WriteLine(str4);
使用指定的字符标志来分割字符串,获得子字符串
&&&&&&&&&&& //char[] c = new char[] { ',' };
&&&&&&&&&&& //string[] str5 = str.Split(c);
&&&&&&&&&&& //Console.WriteLine(str5.Length);
&&&&&&&&&&& //foreach (string item in str5)
&&&&&&&&&&& //{
&&&&&&&&&&& //&&& Console.WriteLine(item);
&&&&&&&&&&& //}
&&&&&&&&&&& //Console.WriteLine(str.ToUpper());
&&&&&&&&&&& //string str7 = str.Trim(' ');
&&&&&&&&&&& //Console.WriteLine(str7);
从给定下标位置输出后面的字符串
&&&&&&&&&&& //string str8 = str.Substring(3, 5);
&&&&&&&&&&& //Console.WriteLine(str8);
方法的重载
1.方法名相同
2.参数不同 ( 1)参数类型不同 &(2)参数个数不同
如果try里面有错误就执行catch里面的代码,否则不执行catch;但是不管try里面有没有错误都会执行finally里面的内容;
int a = int.Parse(Console.ReadLine());
Console.Write("成功的捕捉到了异常");
13委托 事件
//================================================================
委托的定义位置,可以放到类和方法同级,
也可以放到命名空间下和类同级。
委托的返回值:多播委托的返回值是最后一个方法的返回值;
匿名委托格式: & Pao p = delegate(){return 0 ;};
有参数有返回值的匿名委托:
一,用于创建有返回值类型的委托就用泛型委托;注意:返回值一定是尖括号最后的那个参数;
泛型委托:1. Func&bool& laowang =new Func&bool&(bool.Ask);
& & & & & & & & & & bool result = laowang();
& & & & & & & & 2.& Func&string ,bool& laowang =new Func&string,bool&(bool.Ask);
二, &Actiong:用于创建没有返回值类型的委托:
& & & & & & & &
& & & & & & & &Action&string& & laowang3 &= new Action&string&(boy.SayLove);
《第十二讲:C#语言编程》集合
1. (*)用集合保存4个人的随机投票,列出最终票数及各自的名字
2. (* *)在一个有限平面区域上(1000 * 1000)随机生成有序的n个点(用结构体表示点),将其保存在集合中
& (1)输出所有点的坐标信息
& (2)计算有序相邻两点距离之和(先排序,再求距离)
3. (* * *)队列:仿照模拟经营类游戏中的情形,自定义一个窗口类,实例化一个窗口,一共有10位顾客,每位顾客接受服务的时间为2~3分钟,求15分钟后仍为接受服务的顾客名单。
ArryList和List&T&
《第十二讲:C#语言编程》集合课后题:1.&(*)用集合保存4个人的随机投票,列出最终票数及各自的名字2.&(*&*)在一个有限平面区域上(1000&*&1000)随机生成有序的n个点(用结构体表示点),将其保存在集合中&&(1)输出所有点的坐标信息&&(2)计算有序相邻两点距离之和(先排序,再求距离)
3.&(*&*&*)队列:仿照模拟经营类游戏中的情形,自定义一个窗口类,实例化一个窗口,一共有10位顾客,每位顾客接受服务的时间为2~3分钟,求15分钟后仍未接受服务的顾客名单。
//实例化一个字典对象(代码放在主函数里面)
&&&&&&&&&&&&Dictionary&string&,&int&& dic =&new&Dictionary&&string,&int&();
&&&&&&&&&&&
&&&&&&&&&&&&for&(&int&i = 0; i & 4; i++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&&&string&name =&Console.ReadLine();
&&&&&&&&&&&&&&&&if&(dic.ContainsKey(name))
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& dic[name] += 1;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& dic.Add(name, 1);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&&&foreach&(&var&item&in&dic)
&&&&&&&&&&& {
&&&&&&&&&&&&&&&&Console.WriteLine(item);
&&&&&&&&&&& }
namespace&集合
&&&&struct&Point
&&&&&&public&&&float&x;
&&&&&&&public&&float&y;
&&&&class&Program
&&&&&&&&static&void&Main(&string[] args)
&&&&&&&&&&&&List&&Point& li =&new&List&&Point&();
&&&&&&&&&&&&Random&ran =&new&Random();
&&&&&&&&&&&&Point&p =&new&Point();
&&&&&&&&&&&&for&(&int&i = 0; i & 5; i++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& p.x = ran.Next(0, 1000);
&&&&&&&&&&&&&&& p.y = ran.Next(0, 1000);
&&&&&&&&&&&&&&& li.Add(p);
&&&&&&&&&&& }
&&&&&&&&&&&&foreach&(&var&item&in&li)
&&&&&&&&&&& {
&&&&&&&&&&&&&&&&Console.WriteLine(&"x坐标为{0},y坐标为{1}"&,item.x,item.y);
&&&&&&&&&&& }
&&&&&&&&&&&
namespace&集合
&&&public&&struct&Point
&&&&&&&&public&float&x;
&&&&&&&&public&float&y;
&&&&public&static&class&Tool
&&&&&&&&public&&static&double&Dis(&Point&p1,&Point&p2)
&&&&&&&&&&&&double&m = (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
&&&&&&&&&&&&double&z =&Math.Sqrt(m);
&&&&&&&&&&&&return&z;
&&&&class&Program
&&&&&&&&static&void&Main(&string[] args)
&&&&&&&&&&&&List&&Point& li =&new&List&&Point&();
&&&&&&&&&&&&Random&ran =&new&Random();
&&&&&&&&&&&&Point&p =&new&Point();
&&&&&&&&&&&&for&(&int&i = 0; i & 5; i++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& p.x = ran.Next(0, 1000);
&&&&&&&&&&&&&&& p.y = ran.Next(0, 1000);
&&&&&&&&&&&&&&& li.Add(p);
&&&&&&&&&&& }
&&&&&&&&&&&&for&(&int&i = 0; i & 4; i++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&&&for&(&int&j = 0; j & 4-i; j++)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&if&(li[j].x&li[j+1].x)
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&Point&item = li[j];
&&&&&&&&&&&&&&&&&&&&&&& li[j] = li[j + 1];
&&&&&&&&&&&&&&&&&&&&&&& li[j + 1] =
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&&&double&totaldistance = 0;
&&&&&&&&&&&&for&(&int&i = 4; i & 0; i--)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& totaldistance +=&Tool.Dis(li[i], li[i -1]);
&&&&&&&&&&& }
&&&&&&&&&&&&Console.WriteLine(totaldistance);
&&&&&&&&&&&&foreach&(&var&item&in&li)
&&&&&&&&&&& {
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&Console.WriteLine(&"x坐标为{0},y坐标为{1}"&,item.x,item.y);
&&&&&&&&&&& }
&&&&&&&&&&&
&class&Program
&&&&&&&&static&void&Main(&string[] args)
&&&&&&&&&&&&Random&ran =&new&Random();
&&&&&&&&&&&&Queue&&int& t =&new&Queue&&int&();
&&&&&&&&&&&&int&sum = 0;
&&&&&&&&&&&&int&z;
&&&&&&&&&&&&for&(&int&i = 0; i & 9; i++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&&&int&n = ran.Next(2, 4);
&&&&&&&&&&&&&&& sum +=
&&&&&&&&&&&&&&&&if&(sum &= 15)&
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& t.Enqueue(n);
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& z = 9 -
&&&&&&&&&&&&&&&&&&&&Console.WriteLine(&"还有{0}位客人没有接受服务"&, z);
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&
&&&&&&&&&&&
冒泡排序,选择排序
int[,]&a&=&new&int[4,&3];
&&&&&&&&&&&&for&(int&i&=&0;&i&&&a.GetLength(0);&i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&for&(int&j&=&0;&j&&&a.GetLength(1);&j++)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&a[i,&j]&=&int.Parse(Console.ReadLine());&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&&&&&//打印数组&&&&&&&&&&&&for&(int&i&=&0;&i&&&a.GetLength(0);&i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&for&(int&j&=&0;&j&&&a.GetLength(1);&j++)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&Console.Write(a[i,&j]&+&"&");&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&Console.WriteLine();&&&&&&&&&&&&}&&&&&&&&&&&&for&(int&i&=&0;&i&&&a.GetLength(1);&i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Console.Write(a[0,&i]&+&"&");&&&&&&&&&&&&}&&&&&&&&&&&&int&sum&=&0;&&&&&&&&&&&&for&(int&i&=&0;&i&&&a.GetLength(1);&i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&sum&+=&a[1,&i];&&&&&&&&&&&&}
&&&&&&&&&&&&Console.WriteLine("sum="&+&sum);
类名方法名大写
unity引擎组件
两种打印的方式:1.print,继承于MonoBehaviour类;只有在继承MoNoBehaviour类的时候才能用
& & & & & & & & & & & & &
& & & & & & & & & & & & & 2. debug.log; &debug类中还有两个只能在Sence模块看到的测试划线1.Drawline(Vector3 start,Vector3 end);
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 2.DrawRay(Vector3 start,Vector3 dir);
GameObect类的属性:tag,name FindGameObjectsWithTag(string tag) &T GetComponent&T&() &SetActive(bool value) &FindWithTag(string tag)
字典元素的访问:可以用foreach将字典键值对的完整信息打印出来,也可以通过索引仅仅输出键的值、
& & & & & & & & & & & & &在直接通过索引取值的时候要注意:key值要在存在的情况下才能取成功;
抽象方法:在父类中定义不能实现
& & & & & & & ;只能出现在抽象类中&
& & & & & & &:方法返回值前面要加abstract
& & & & & & & ;子类实现抽象方法的时候需要加abstract;
基本数据类型
1.int类型 4字节 &32位整型&& uint 无符号整型 unsigned
2. 单精度浮点数(float)4字节 & &后面加f,例如:23.5f,23f
3.双精度浮点数(double)8字节 后面加d 也可不加,例如:23.5,14.7d
4.128位高精度浮点数(decima) 16字节 后缀m ,例如:15.67m,它的取值范围上面两种浮点类型小,但精确度最高。
5.字符类型(char)2字节,用单引号引起来,例如&0&
6.字符串(string)由0个,1个或者2个以上的字符组成并用双引号引起来,&0&,&1&,&lisi&
7.布尔类型(bool),取值只能为true或false
数组,枚举,结构体
枚举,结构体
枚举类型的变量只有赋值之后才能使用,并且所赋的值必须是有效的:不同的枚举可以有相同的值,不会冲突,比如week.day和month.
结构体:使用结构体的成员时的格式:结构体类型变量.成员名 & & & &P & & & & & & & & p.name=
& & & & & &:结构体的成员都不允许直接初始化(不能直接赋值):
泛型方法:public void 方法名字 &&类型&(){}
泛型类:Test&int& a = new Test&int& ();
泛型参数的约束:public class Test&T&Where T:Struct {} & & & & 只能是值类型的
& & & & & & & & & & & &:public class Test&T&Where T:Class {} & & & & 只能是引用类型的
接口与泛型
接口与泛型
1.接口的定义:访问修饰符interface接口名{成员}
2.接口是一个抽象的该年,目的在于子类实现它
3.接口通常用来定义不同类之间的统一的标准
4.接口的成员:包括方法、属性、事件、索引、不能有字段
5.接口成员不能加修饰符,默认为public并且要求实现类(子类)去实现接口里的所有接口成员
6.接口和抽象类一样,是抽象的概念,所以不能创建对象(不能new)
7.如果一个类实现多个接口,接口之间用逗号","
8如果一个类同时继承一个父类,又实现一个或多个接口,那么父类放在最前面
主函数里面的
11接口,泛型
1. 接口:定义IBattle接口、声明攻击Attack(),移动Move(),&跳跃Jump()等方法;&&&定义IRest接口、声明SitDown(),Sleep()等方法;&&&定义Soldier(战士)、Master(法师)、Assassin(刺客)、Archer(弓箭手)等类,继承上述接口,并实现内部方法。2.&定义MyList类,该类模拟一个动态数组,可以用来存放数据(以int类型为例)。实现如下功能:1)定义属性Count,表示当前动态数组存放的int型元素个数;2)定义方法Clear(),可以清空所有的元素;3)定义方法Add(),可以实现添加元素的功能;4)定义方法Insert(int&value,&int&index),可以实现在某个位置插入元素的功能;5)定义方法Reverse(),可以实现元素的反转。6)定义方法Contains(),可以查找元素是否存在。&3.&老板招募小秘(1)当秘书必须要实现的协议用接口IScretary表示。要想当秘书,必须能够实现如下方法:端茶倒水开车捶背提包等
(2)有两类人前来应聘秘书:
男人类&Man女人类&Woman机器人类&Robot请让以上三个类继承秘书协议,并根据每个类的特点实现协议中的方法
(3)在Main方法中分别创建男秘对象和女秘对象,并自行设计模拟情景。
如:有一天老板招了一个男秘,让他干这干那,后来不满意,又招了一个女秘...
&&&再后来科技突飞猛进,老板雇佣了一个不知疲倦聪明又从来不抱怨的机器秘书
课后题:第一题&定义一个打印机类(printer)。需求:1. 采用单例模式2. 定义成员变量:打印机IP地址(静态变量),打印数量,纸张类型(数值为枚举类型)3. 定义方法:根据打印机IP地址连接打印机;打印功能;打印失败提醒功能第二题&模拟打僵尸。需求:&&定义僵尸类:公共成员变量:类型、总血量、每次失血量方法:初始化方法(设置僵尸种类,总血量)、被打击失血(抽象方法)、死亡(抽象方法)&定义普通僵尸类继承于僵尸类定义有防具(路障)僵尸类继承于僵尸类:特有成员变量:防具类型特有方法:防具被打烂定义铁桶僵尸类继承于有防具僵尸:特有成员变量:弱点特有方法:防具被磁铁吸走1、创建普通僵尸对象,设置总血量50,每次失血量为&32、创建路障僵尸对象,设置总血量80,有路障时,每次失血量为&23、创建铁桶僵尸对象,设置总血量120,有铁桶时,每次失血量为&14、选作:在Main方法里面里用循环语句模拟攻击:
三个僵尸对象同时被攻击:
(1)、普通僵尸被打击时:每次失血3.(2)、路障僵尸被打击时:有路障时,每次失血2,血量剩余一半时,防具被打拦,之后每次失血3.(3)、铁桶僵尸被打击时:有铁桶时,每次失血1,血量剩余1/3时,铁桶被打拦,之后每次失血3.循环攻击过程中:每个僵尸被攻击时,输出本次丢失血量,剩余血量。失去道具时,输出丢失的道具。僵尸死亡时,输出已死亡。
最后一个僵尸死亡时,攻击停止,循环结束。输出总攻击次数。
/*------------------------------------------------------*/
1.(**)定义一个矩形类(Rectangle),成员变量:width,height,XYPoint类型的point(原始点),XYPoint类型的center(中心点)。方法:封装变量为属性,构造方法初始化成员变量,计算周长、计算面积(ref/out参数修饰)2.&(**)&定义玩家类(Player),并创建玩家对象(1)&包含属性:出生日期、星座(2)&构造方法:根据玩家出生日期设置星座(提示:星座设置可参考第二讲作业)3.&(**)&定义如下类装备类:特征:名称武器类&继承&装备类:&&&&特征:等级、攻击力&&&&行为:攻击法杖类&继承&武器类:行为:远程魔法攻击(实现方法替换)弓箭类&继承&武器类:行为:远程物理攻击(实现方法替换)长剑类&继承&武器类:独有特征:防御力行为:进展物理攻击(实现方法替换)防具类&继承&装备类:特征:防御力、耐久度行为:破损4.&(***)
按如下继承关系定义类要求:1. 每个类包含2个以上私有成员变量、保护成员变量2. 每个类所有字段都封装成属性3. 每个类至少有一个属性为只读和只写4. 每个类有两个以上初始化方法5. 动物类有一个移动的方法(move),子类重写(重新实现)该方法6. 为哺乳类添加特有的虚方法(sayHi),子类重写该方法7. 其它方法可以尽情发挥8. 在Main方法中创建各个类的对象,调用类的方法5.(***)&定义英雄类和Boss类,创建3个英雄对象,分别拿不同的武器(用第三题的类创建),对敌人循环回合制攻击,输出战斗过程。英雄类:特征:HP、MP、类型(枚举类型:弓箭手、法师、骑士)、武器(用第一题定义的类)行为:攻击、防御Boss类:特征:HP、攻击力、防御力行为:攻击
(提示:以上各个类及其特征和行为可以自行设计丰富,为项目期做储备)
09面向对象
& & & & & && 封装
virtual override
1. (**)输入一个字符串,&beijinglanoukeji,lanoukeji&is&great,&I&love&lanou&and&unity&,,完成如下要求:(1)判断字符串是否存在lanou,如果存在lanou则输出第一个坐标;&(2)将字符串中出现的所有lanou替换为lanou3g,并输出最后一个lanou3g的坐标;(3)讲字符串改为大写输出出来;(4)判断字符串是否存在&,&,若存在则按字符串&,&分组,输出字符串数组长度,输出所有字符串。2.&(**)定义一个计算器(Computer)类:包含方法:(1)&返回两个数的最大值(2)&返回三个数的最大值(3)&返回两个数的最小值(4)&返回三个数的最小值(5)&返回两个数的和(6)&返回三个数的和&&&(可以自由扩展和完善这个类)&&&3.(***)有一个GET网络请求中,网络连接(url字符串)通常是如下形式:/zh-CN/?query=string其中?后面表示参数。上面的例子中,参数名为query的参数值为string(1)&判断一个字符串是否是合法的url字符串(以http://或https://开头)(2)&判断网络连接中是否包含参数(提示:通过是否有?判断)
4.(****)楼梯有N(小于50的整数)阶,上楼可以一步上一价,也可以一(3)&封装一个方法,输入url字符串,返回其参数名和参数值
次上二阶。编一个程序,计算共有多少种不同的走法。(递归实现)
5.(**)编写一个GameObject类,写一个GetComponent()方法,要求实现两个以上的重载方法,一个参数为string类型,一个参数为自定义枚举类型。方法返回值为string类型,返回一句话,说明调用的是什么方法,参数值是什么。
1. (**)定义分数(Fraction)类:
1)、成员变量
& &私有字段以及可读可写属性:分子、分母
2)、成员方法:
(1)打印分数信息(例如: 1 / 3)
(3)创建一个方法交换分子和分母的值
(4)创建一个方法能同时得到加、减、乘、除、求余运算;
2. (**) 定义一个Car类,用成员变量表示品牌,当前速度,最大速度和方向(假设有东南西北四个方向),为其添加显示速度、显示方向、加速、减速以及转盘(可以向左转向右转)方法
在Main方法中创建Car类对象,并调用其方法
提示:汽车的当前方向(东南西北)以及转盘转向(左右)可以分别用两个枚举表示。每次加速减速的值为定值,速度不能为负值,也不能超过最大速度。
3. (**)定义几何类Geometry
用一个方法同时计算矩形的面积和体积,并同时返回它的面积和体积
4.(**)买房是大事:
1) 创建两个类,模拟生活中房屋和人的特征和行为。
& & 特征:房东、地址、面积、每平米价格
& & 行为:估价、升值等
(提示:房屋的房东是人类;估价返回 面积*每平米价格;升值改变 每平米价格)
& & 特征:姓名、性别、钱、配偶、房子
& & 行为:工作挣钱、买房子、结婚、卖房子、离婚等
(提示:人类的配偶是人类;买房子的参数是房子类)
(2) 在Main方法中运用以上两个类创建(实力化)对象模拟以下情景:
一个人工作挣钱,有一天终于攒够了钱,买了一个房子,然后找了一个对象结婚。
后来婚姻出现了第三者,两人离婚后此人卖掉了房子,最终和第三者结婚。
&&&&&&&&&&&&
作业,类 对象方法
&1.(*)完成课件的练习,建30个类,每个类有自己的特征,为特征填写Get&方法和Set方法。2.&(***)完成蓝鸥班级开班仪式流程:1、早9:30开班仪式开始。(输出(&开班仪式正式开始&))2、刘辉老师做自我介绍。3、三名学生做自我介绍。需求:&&(1)定义一个班级类。成员:所属培训机构名称,班级名,班级人数、授课老师名字、开班日期。方法:初始化(设置学校名字:蓝鸥)、集体活动、开班仪式。&&(2)定义一个老师类。成员:名字、性别、年龄、正在教的课程、正在授课班级。方法:初始化、讲课、布置作业、验收作业、解决问题、自我介绍。&&(3)定义一个学生类。成员:名字、性别、年龄、学号、班级名、任课老师、正在学习的课程。方法:初始化、学习、做作业、提出问题、回答问题、自我介绍。3.(**)创建一个方法,功能是把一个int类型的数组拷贝到另外一个数组里面,并把数组各元素打印出来;4.(**)创建一个方法,求一个int类型数组里面元素的和,并把和打印出来;
类和面向对象编程
类,对象,类成员:字段、方法
//用类创建一个对象,用new运算符,类里面用来描述特征的变量称为这个类的字段
& & & & & & //Car car = new Car();
&&&&&&&&&&& ////使用对象调用字段时,用点运算符得到字段并赋值,
&&&&&&&&&&& ////如果在类外部使用字段时,字段一定用public修饰
&&&&&&&&&&& //car.color = "red";
&&&&&&&&&&& //car.price = 100.5;
&&&&&&&&&&& //car.type = "BMW";
&&&&&&&&&&& ////用点运算符点出来的成员,前面如果是
&&&&&&&&&&& ////F表示的是字段(field),M表示的是方法,C表示类,E表示枚举,S代表结构体,
&&&&&&&&&&& ////D表示委托,I表示接口,'{'表示名字空间,P表示属性
& ////API)(Application Program Interface)应用程序开发接口
1. (***)定义一个枚举类型PlayerStatus(包括:跑run,跳jump,下滑sliding,左转弯turnLeft,右转弯turnRight),用来表示玩家的动作,结合switch/case语句使用,写一个小程序:按W跑,空格跳,S下滑,A左转弯,D右转变.2. (*)定义一个枚举类型PrimitiveType(包括:正方体&cube,球体&sphere,胶囊体&capsule,圆柱体cylinder,平面plane,四边形quad),用来存在常用的游戏物体。定义一个枚举变量并赋值,输出其默认的整型值。3. (**)结构体排序:定义一个结构体Vector3(包括x,y,z三个公共成员变量,float类型),声明3个结构体变量,按照x由小到大得排序规则(x相同的则按照y排,y相同则按照z排序),依次输出三个变量。4. (***)某班有5个学生,三门课(数学,英语和语文)。分别实现以下要求:&(1)&求各门课的平均分;&(2)&找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩;&(3)&找出三门课平均成绩在85-90分的学生,并输出其学号和姓名&;(4)按成绩对学生进行降序排序,如果数学成绩相等,按英语成绩排序,如果英语成绩相等,按语文成绩排序;5.(**)用枚举表示网购订单状态,输入推进状态数,模拟订单进展过程,并显示最终状态。订单状态参考:&未确认,已确认,已取消,无效,未发货,已发货,未付款,已付款,退货,确认收货,完成。6.&(**)创建一个英雄结构体变量,成员包含英雄当前状态。&&&&&英雄的可以有名字,HP,MP等属性7.&(***)用结构体数组创建创建两个战队(每队5人),为每个英雄赋随机属性,合算综合战斗力并输出
&&&&&&提示:战斗力可以是平均等级,攻击力,血量等等。也可以是由这些数值构成的一个综合表达式
结构体访问修饰符
&&&&&&&&&&&&如果在类和结构体里面,成员前面不加任何修饰符,则该成员是private的,
&&&&&&&&&&& 表示在类或者结构体的外部不能点出来的私有成员
&&&&&&&&&&& 如果在名字空间下定义的类或者结果体,默认的访问级别是internal的,
&&&&&&&&&&& 表示只能在改名字空间内部使用外部不能使用;
&&&&&&&&&&& 跨类、名字空间用public
&&&&&&&&&&& internal在名字空间内使用
&1.(**)从控制台先输入你一个整数n,表示之后会输入n个年龄.将结果按由大到小排序输出.例如:请输入n:3请输入3个年龄:283119结果为:31,28,19
2.(**)求一个4阶数字矩阵(数值随机产生)对角线的和,如;
1&&&2&&&3&&&45&&&6&&&7&&&89&&10&&11&&1213&14&&15&&16输出:&69.3.(***)输入一个n,随机生成一个n*n的二维数组地图,数组元素值随机产生.完成如下操作.例如输入3,自动生成:1&2&3&4&5&67&8&91)求下三角元素的和.(上例为1+4+5+7+8+9=34)2)遍历二维数组,如果二维数组元素值为偶数,将元素更新为&*&,如果为奇数,将元素更新为&&#&.#&*&#*&#&*#&*&#3)将上图看做一个游戏地图(#为二维坐标系0,0点),输入一个x,y值,将元素更改为&$&.例如:输入(0,0),输出#&*&#*&#&*$&*&#4.(***)声明一个二维数组,存放游戏玩家可以行走的四个方向(前后左右),假如游戏玩家在二维坐标系的原点,按下w/s/a/d(不区分大小写)代表前后左右,循环输入字符,输出游戏玩家的位置;
数组定义,数组初始化:动态初始化,静态初始化
int[ ] array=new int[6]; & new 是运算符;数值类型初始值为0,bool类型是false,字符串初始值null.
动态初始化:数据类型[] 数组名=new 数据类型[数组长度]{元素1,元素2};
03循环数组作业
1、(*)编程将所有&水仙花数&打印出来,并打印其总个数。 &水仙花数&是一个 各个位立方之和等于该整数的三位数。
2、(**)找出下列整型数组中最大和最小值及其所在位置i。
int[] a={3,5,8,13,47,9};
int[] b ={-23,45,14,65};
3、(***)给定某年某月某日,输出其为这一年的第几天。
4、(**)已知abc+cba = 1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有组合。
5、(***)输入两个数,求最大公约数和最小公倍数。(用两种方法:辗转相除法和普通方法)。
6、(****)输入n,分别用*输出边长为n的实心菱形和空心菱形。
例如:n = 3时,输出:
7. 分别用while、do...while、for循环打印1~100之间3的倍数
8. 用while和for循环打印出1-100之间7的倍数,个位为7的数,十位为7的倍数,不是7的倍数并且不包含7
9. 使用嵌套循环产生下列图案:
PPT上的练习
1.分别用静态初始化和动态初始化定义一个具有5个元素的整型数组,并求数组元素的和。
2.将上面声明的2个数组对应元素相加,放到另外一个数组中。
3.复制一个数组,即两个数组容量一样,把其中一个数组中的元素复制到另外一个数组中。
//定义一个变量记录圈数,循环变量初始化
& int i = 0;
//执行循环的条件即循环条件
&while (i & 10)
&Console.WriteLine("跑" + i);
//i是循环变量
//条件越来越不满足,最终跳出循环
//for(循环变量初始化;条件判断;循环变量变化)
}Console.WriteLine("{0,2}",i);前面2个空格,-2后面两个空格(左对齐)
//外层行数,内层是行的内容
for (int j = 1; j & 4; j++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& for (int i = 1; i & 4; i++)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& Console .Write("{0,-2}" , i);
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& Console .WriteLine();
&&&&&&&&&&& }
/九九乘法表
for (int i = 1; i &= 9; i++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& for (int j = 1; j &= j++)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& Console .Write("{0}*{1}={2,-3}" , j, i,i*j);
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& Console .WriteLine();
&&&&&&&&&&& }
&&&&&&&&&&& Console .ReadKey();
循环总结:
for最常用,通常用于知道循环次数的循环
while也很常用,通常用于不知道循环次数的循环
do&&while不是很常用,通常用于需要先执行一次的循环
break跳出本层循环,continue结束本次循环,通常与if连用
for()中定义的变量只作用于循环体{ }中。
1、(*)编写一个程序,要求用户从键盘输入2个float数据,输出最大者.2、(**)编写一个程序,要求用户从键盘输入3个不同整数,输出中间者.3、(**)从键盘输入两个实数a和b,代表两点在X轴的坐标,再输入一个0到1之间的数c,代表时间,(假如从a到b需要1s),输出在时间c时的坐标.例如:输入a为1和b为5,再输入c为0.5,则输出结果为:3.4、(**)输入一个成绩(0到100之间的整数),如果大于等于90输出:优秀;小于90而大于等于80输出:良好;小于80而大于等于70输出:一般;小于70而大于等于60输出:及格,否则输出:不及格.5、(***)输入一个生日日期,输出其星座.6.(*)输入一个整数,判断奇偶,并输出&某某是奇数&或者&某某是偶数&。7.(*)输入一个数,判断符号。如果大于0,输出&正数&;如果小于0,输出&负数&;如果等于0,输出&0&。8.(**)有一个函数:x&1的时候,y&=&x;1&=x&10的时候,y=2x-1;x&=10的时候,y=3x-11。写一段程序,输入x,输出y值9.(***)输入3个数,判断是否能构成三角形
10.&(**)编制一个完成两个数四则运算程序。如:用户输入34+56则输出结果为90.00,要求运算结果保留2位有效小数,用户输入时将2个运算数以及运算符都输入,根据运算符求结果
switch case
switch (date)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& case 1:
&&&&&&&&&&&&&&&&&&& Console .WriteLine("周一" );
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& case 2:
&&&&&&&&&&&&&&&&&&& Console .WriteLine("周二" );
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& case 3:
&&&&&&&&&&&&&&&&&&& Console .WriteLine("周三" );
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& case 4:
&&&&&&&&&&&&&&&&&&& Console .WriteLine("周四" );
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& case 5:
&&&&&&&&&&&&&&&&&&& Console .WriteLine("周五" );
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& case 6:
&&&&&&&&&&&&&&&&&&& Console .WriteLine("周六" );
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& case 7:
&&&&&&&&&&&&&&&&&&& Console .WriteLine("周日" );
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& default :
&&&&&&&&&&&&&&&&&&& Console .WriteLine("大保健" );
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&& }
1.switch里面可以没有default语句块,如果所有的case都不符合要求时
&&&&&&&&&&& 会直接跳出switch开关
&&&&&&&&&&& 2.如果case后面有语句,则一定要有break
&&&&&&&&&&& 3.如果case后面没}

我要回帖

更多关于 unity3d文件怎么查看 的文章

更多推荐

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

点击添加站长微信