angrybird学习有感

*都是系统自己的方法
1.学到了一个新的组件
SpringJoint2D
连接两个刚体,在这里给左边的树枝加上刚体组件,但是由于只需要这个刚体组件,所以在bodytype上选择static
上面有一个选项是Distance,这是不可摆动距离,distance越大,小鸟摆动范围越小
frequency 弹簧摆动频率

2.学到新的方法
*OnMouseDown()鼠标一直按下
*OnMouseUp()鼠标抬起
鼠标一直按下系统是可以检测到的,但是我们要利用鼠标一直按下这个状态需要一个标志我们把这个标志设定为isClick=true,也就是说当系统检测到鼠标一直按下的时候,isClick是为true的

3.屏幕坐标转换为2d坐标
当我们把屏幕坐标赋给小鸟时,是没有办法transform.position=Input.mousePosition;(鼠标坐标输入我是不熟练的)
因为屏幕坐标是以左下角为原点
小鸟的坐标为世界坐标,以中心为原点
所以需要坐标转换:transform.position=Camera.main.ScreenToWorldPoint(Input.mousePosition);//小鸟跟随鼠标位置
但是在game模式下看不到小鸟的位置是因为小鸟的z坐标和相机相等,这样就看不到小鸟了,除非小鸟在相机前面一点,因为还需要修改
transform.position+=new Vector3(0,0,-Camera.main.transform.position.z);也就是说将相机的z坐标减去

4.距离最大距离位置怎么确定
(1)确定小鸟位置与基准位置的单位向量
(2)将自己确定的maxDis*单位向量
(3)将基准坐标加上maxDis*单位向量得到新的限定好的小鸟的位置

5.小鸟以一定的速度飞出,弹簧组件失活(有点复杂)
第一种情况:若在鼠标抬起的时候使弹簧组件失活,因为弹簧组件是物理效果,在使用过程中会产生很大的速度。
第二种情况:(解决速度大的问题,可以改变小鸟刚体上的bodytype)
使用kinematic意思是开启动力学,在开启动力学的时候不受物理因素的影响,不进行物理计算,打算在松开的那一刻进行物理计算然后再飞出。意思就是在鼠标一直摁下的时候使iskinematic=true,然后在松手的时候iskinematic=false,但是发现小鸟没有速度,这是因为在iskinematic=false的同时,弹簧组件也失活了,并没有进行物理计算,因此没有速度
正确的做法:

6.延时方法Invoke
将弹簧失活的代码写在一个新的方法里,叫Fly
然后在鼠标抬起的方法中写
Invoke(“方法名:Fly”,time:0.1f);
这个的意思呢就是让鼠标抬起的时候,弹簧不马上失活,运行个0.1秒的时间之后然后再失活,给小鸟一定时间的速度。

7.*OnCollisionEnter(Collision2D collision)
有两个物体A和B,当A挂载rigidbody而B没有挂载的时候,当B去碰A,不会触发这个方法。
但如果A去碰B的时候,A会被弹开,但B不会动,A和B都会触发这个方法,这说明两者都必须有碰撞组件
这里是让小猪死亡或受伤由速度判断,因为这里有两个运动物体,且小猪的运动是由小鸟的碰撞造成的,所以在这里使用相对速度(我也不知道为什么要使用相对速度。。。)且相对速度是一个向量
碰撞体记录了他的速度
collision.relativeVelocity.magnitude(会返回向量的一个长度)

8.更改图片要获得SpriteRenderer组件,然后在条件内写
在前面public sprite hurt;
private SpriteRenderer renderer;
render(组件).sprite=图片名称:hurt;

9.新的组件LineRenderer
给左右树枝添加LineRenderer组件,因为要在bird脚本里实现画线操作,而画线的操作是绑定在LineRenderer这个组件上的,但是bird这个脚本是绑在bird这个物体上的,所以要在脚本前面添加两个public
public LineRenderer left;
public LineRenderer right;
画线的方法中left.SetPosition(0,第一个点的位置)
left.SetPosition(1,第二个点的位置)
两个点确定一条线这样就画出来一条线来

猜你喜欢

转载自blog.csdn.net/vickieyy/article/details/82663974