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
由于限定刚体位置的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用法:
Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可以这么设置
transform.rotation = Quaternion.identity;
mathf.Lerp插值运算,用于渐变
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
有这样的一个int类型的集合:
static List GetInitialData()
{
return new List(){1,2,3,4};
}
需要打印出所有值大于2的元素。
不使用yield return的实现
static IEnumerable FilterWithoutYield()
{
List result = new List();
foreach (int i in GetInitialData())
{
if (i > 2)
{
result.Add(i);
}
}
return result;
}
输出结果:3,4
使用yeild return实现
static IEnumerable FilterWithYield()
{
foreach (int i in GetInitialData())
{
if (i > 2)
{
yield return i;
}
}
yield break;
Console.WriteLine("这里的代码不执行");
}
输出结果:3,4
总结:
通过单步调试发现:
虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。
第一种方法,客户端调用过程大致为:
使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?
--因为,编译器会生成一个状态机来维护迭代器的状态。
简单地说,当希望获取一个IEnumerable
c# coroutine:类似于Android延迟一段时间需要开辟新线程
用法:StartCoroutine(函数名());
IEnumerator 函数名(){
yield return ;
}
c#中需要强转,后面加 as 类型即可
协程在执行到第一个yield return就不执行了,然后到第二帧执行到第二个yield return就不执行了,第三帧。。。
找组件这样也可以啊
添加一个力矩到刚体。
作为结果刚体将绕着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系统:自动攻击和自动寻路