unity总结六

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选项


Updata函数和FixedUpdate函数的区别:

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用法:

Instantiate(Object original, Vector3 position, Quaternion rotation);

original是创建的对象,position是对象要放的位置坐标,rotation是旋转的角度。
Quaternion的意思是四元数,用于代表旋转。
Quaternion.identity的含义:

Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可以这么设置
transform.rotation = Quaternion.identity;

mathf.Lerp插值运算,用于渐变

 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系统:自动攻击和自动寻路


 





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值