unity总结六
来源:互联网 发布:福科软件教学 编辑:程序博客网 时间:2024/06/06 01:44
vs快捷键:
回到上一个光标位置:使用组合键Ctrl + -
前进到下一个光标位置:“Ctrl + Shift + -
查找:使用组合键“Ctrl+F”;
搜索 使用组合键Ctrl+i
复制一整行代码,Ctrl+C
剪切一整行代码,Ctrl+X
删除一整行代码,Ctrl+L
Ctrl+Enter:在当前行的上面插入一个空行;
Ctrl+Shift+Enter:在当前行的下面插入一个空行。
注释:组合键Ctrl+K+C
取消注释:组合键“Ctrl+K+U
转小写:Ctrl+ U
转大写:CTRL + SHIFT + U
如果操纵rigidbody,脚本的具体操纵要写在void FixedUpdate(){}函数中
在unity4当中rigidbody.velocity直接去的rigidbody的速度是可以的然而在unity5当中这样写取不出rigidbody,这是因为unity5当中把语法规范化了,先 Rigidbody rigidbody;然后rigidbody = GetComponent<Rigidbody>();然后才能拿到.velocity
由于限定刚体位置的x在xMin,xMax之间,所以调用了mathf.clamp值,该函数的作用是取得xMin,xMax之间的值,打灰机项目中在update函数中添加这行代码可以永远控制飞机的位置不超出边界
在脚本中创建了2个类,但是在unity中只会显示monobehaviour类中的参数,我们需要把它可序列化
只需添加一行即可
这样unity中显示两个类的参数
飞船发射的子弹不希望有边边,在shader---->particles----->addictive这样就直剩子弹了
组件collider要使用Trigger检测物体进入,则需要勾选Is Trigger选项
Update是在每次渲染新的一帧的时候才会调用
FixedUpdate,是在固定的时间间隔执行,不受游戏帧率(fps)的影响
FixedUpdate的时间间隔可以在项目设置中更改,Edit->Project Setting->time 找到Fixed timestep。就可以修改了
在检测鼠标的上下左右键时可以卸载fixedupdate函数中
飞机一秒只发射4发子弹的代码;
public float fireRate=0.25f;
private float nextFire;
if( time.time>nextFire ){
nextFire=time.time+fireRate;
//具体操作
。。。
}
instantiate用法:
original是创建的对象,position是对象要放的位置坐标,rotation是旋转的角度。
Quaternion的意思是四元数,用于代表旋转。
Quaternion.identity的含义:
Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可以这么设置mathf.Lerp插值运算,用于渐变transform.rotation = Quaternion.identity;
Mathf.Lerp(float ,float,float);//基于浮点数第三个参数返回第一个数到第二个数之间的插值,第三个参数限制在0~1之间。
var minimum = 10.0;var maximum = 20.0;float a=Mathf.Lerp(minimum, maximum, Time.time) // 在一秒内从minimum渐变到maximum一般运动的物体添加rigidbody属性,墙不用添加rigidbody
在打灰机项目中控制飞机的移动这样操作。可以看到rigidbody.velocity是个向量,用平面的x,y轴的长度放到一个向量上乘以速度赋给刚体的速度
float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); Vector3 move=new Vector3(h,0f,v); rigidbody.velocity = speed * move;打灰机是怎么发射子弹的:这里的发射位置就是飞机的枪口,在枪口这个位置创建子弹的实例public GameObject bolt; //发射子弹 public GameObject spawnPosition; //发射位置 void Update() { if (Input.GetButton("Fire1")) { Instantiate(bolt,spawnPosition.transform.position,spawnPosition.transform.rotation); } }打灰机子弹打出屏幕如何消失的呢?创建一个cube,添加box collider属性设置size为游戏背景的大小,勾选is trigger,在OnTriggerExit函数中Destroy(other.gameObject);即可如何让陨石实现自我旋转的:这里Random.insideUnitSphere函数是返回半径为1的球体内的一个随机点,这里rigidbody.angularVelocity是刚体的角速度向量,不是角速度长度,如果是角速度长度则是rigidbody.angularVelocity.magnitude
rigidbody.angularVelocity = Random.insideUnitSphere*5;
打灰机是如何实现爆炸效果的:这里的playerExplosion当然在脚本外属性中把爆炸效果拖动到其中
public GameObject playerExplosion; void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "feiji") { Instantiate(playerExplosion, this.transform.position, this.transform.rotation); }
打灰机中陨石一坨一坨往下掉:public GameObject[] xingXing;void Update () { if (Random.value<0.1) { Xiahua(); }}
//陨石下滑函数 void Xiahua() { GameObject o = xingXing[Random.Range(0,xingXing.Length)]; Vector3 p = new Vector3(Random.Range(-vector.x,vector.x),vector.y,vector.z); Quaternion q = Quaternion.identity; Instantiate(o,p,q); }打灰机中每次发射一个导弹就发出声音,当点击鼠标左键时候,audio.PlayOneShot(audioClip);
yield return用法:yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历。
有这样的一个int类型的集合:
static List<int> GetInitialData(){ return new List<int>(){1,2,3,4};}需要打印出所有值大于2的元素。
不使用yield return的实现
static IEnumerable<int> FilterWithoutYield(){ List<int> result = new List<int>(); foreach (int i in GetInitialData()) { if (i > 2) { result.Add(i); } } return result;}输出结果:3,4
使用yeild return实现
static IEnumerable<int> FilterWithYield(){ foreach (int i in GetInitialData()) { if (i > 2) { yield return i; } } yield break; Console.WriteLine("这里的代码不执行");}输出结果:3,4
总结:
通过单步调试发现:
虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。
第一种方法,客户端调用过程大致为:
使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?
--因为,编译器会生成一个状态机来维护迭代器的状态。
简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。
c#的委托类似于java的接口回调,Android的按钮监听,点击回调函数触发事件,c#是通过委托。c# coroutine:类似于Android延迟一段时间需要开辟新线程
用法:StartCoroutine(函数名());
IEnumerator 函数名(){ yield return ;
}
c#中需要强转,后面加 as 类型即可
协程在执行到第一个yield return就不执行了,然后到第二帧执行到第二个yield return就不执行了,第三帧。。。
找组件这样也可以啊
Rigidbody.AddTorque 添加力矩
添加一个力矩到刚体。
作为结果刚体将绕着torque轴旋转。
//旋转刚体绕世界y轴function FixedUpdate () {rigidbody.AddTorque (Vector3.up * 10);}vector3.lerp()函数的用法:常用于渐变,比如物体从a点移动到b点,就用该插值函数
透视相机和正交相机:transform.position = Vector3.Lerp(start.position, end.position, Time.time);
正交Orthographic (无消失点投影)
正交视图无法看到一个物体是远离自己还是正在我们面前。为什么?因为它不会根据距离收缩。所以如果你如果你画一个固定大小的物体在视点前面,同时画一个同样大小的物体在第一个物体的远后方,你无法说那个物体是第一个。因为两个都是一样的大小,根距离无关。他们不会随着距离而收缩。通常我们在unity中制作2D UI,或是2D游戏的时候,就会把Camera的投射选择此项,例如NGUI的UICamera组件,默认的视图就是正交,还有2DTookit,也会把Main Camera的视图选择成正交透视Perspective (有消失点投影)
透视视图和我们从眼睛看到的视图是一样的。例如,一个高个子的人站在你面前,他看上去是很高的。但是如果这个高个子站在100米以外,他甚至还没有你的拇指大。他看上去会随着距离而缩小,但是我们实际上都知道,它依然是个高个子。这种效果叫做透视。上面例子中提到的两个物体,第二个物体将会显示地更小,所以我们可以区分哪个是离我们近的物体,那个是离我们远的物体。这个在3D中经常用到,例如3D Max中几种不同的视图,而Unity的Main Camera默认也是这种视图。切水果游戏的一些小总结:当水果从屏幕下面出来要实例化一个水果,实例的位置在屏幕下面的中间位置,加上屏幕的左右一半的正负坐标要让水果向上走,需要两步,第一步,给它一个初始速度,第二,给它一个扭矩,推动它向上走
他这里让水果每隔2秒产生一个就在start方法里面调用InvokeRepeating方法,每隔2秒调用Spawn方法产生一个水果
如果报错这样:
解决方法:如果在rigidbody中没勾选is Kinematic那么要在mesh Collider中勾选Convex
来说下切水果手指滑动怎么判断切到水果,视频中讲的是手指滑动的线上每一点像镜头里面发射一条射线,如果射线穿过水果,就判断切到,
具体方法如下:
start.x,end.x都是鼠标移动得到的坐标,在屏幕的坐标,需要转成世界坐标,所以用Camera.main.ScreenToWorldPoint函数,这里如果不知道a的接收变量的类型,选用var接收,相当于java中的object
添加一个Gameobject添加Line Renderer属性,把切水果的划痕材质拖到里面,在Line Renderer属性中有个Position,意思是在线段中设置几个点,我们设10个点在里面,当然如果你想通过捕获当前鼠标按下的坐标,然后触发碰撞检测事件来判断碰撞,这样不行,因为鼠标按下每一帧都会捕获,也就是每一帧都会返回一个坐标,我们应该让采样慢点,也即鼠标滑了0.1f距离捕获一次坐标。将这个坐标保存到一个大小为9的数组中,采样一次数组更新一次(计数+1),队列向前移动一个单位,具体代码如下:
我们拿到了0.1f划痕采样的10个点,接着,遍历10个点,射线检测看有没有碰到水果
我们看到在每两个点之间,这里又分成了若干段,通过插值函数vector3.lerp来对每一段进行射线检测,最后还要记得把数组中的点传到Line Renderer属性中的Position中在另一个项目中,通过屏幕滑动拿到局部坐标的api是这样
只要在屏幕上滑动就会不断返回二维坐标
AI系统:自动攻击和自动寻路
- unity总结六
- 【unity优化六】代码
- 【Unity】Unity优化总结
- Unity总结
- Unity之EditorGUILayout-Password-六
- Unity之EditorWindow-Notification-六
- Unity之EditorUtility.DisplayDialogComplex-六
- Unity API(六):Rigibody
- 【Unity优化】Unity优化总结
- Unity NGUI使用总结
- unity性能优化总结
- unity脚本小总结
- unity --项目总结-1
- Unity常用代码总结
- unity 美术总结
- unity项目总结-2
- unity项目总结-3
- unity串口通讯总结
- 求连通分量
- ThinkPHP框架安装介绍
- CentOS搭建php开发环境(安装apache,mysql,php)
- 游戏API接口开发过程中需要注意哪些事
- hello
- unity总结六
- Android开发学习系列-----开发环境准备
- WPA/WPA2安全认证加密原理详解
- 链表面试题
- android 百分比布局
- 期待!| Kubernetes 1.6 即将发布
- confirm的使用
- maven本地仓库架包存在,项目还是报错?
- JavaScript中声明变量时 带var和不带var的区别