unity3d小技巧

这是以前刚开始学unity时遇到的一些问题的笔记,现在看来有些幼稚,但是还是发出来给刚入门的同学参考一下。


1. 如何在game模式下放大缩小视图:控制camera的size

2.如何获取图片的长宽:background is a Gameobject        height = background.GetComponent().sprite.bounds.size.x;        width = background.GetComponent().sprite.bounds.size.y;

3. 手指移动相机并限定移动范围

```

if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)

{

if ((transform.position.x >= leftborder) && (transform.position.x <= rightborder))

{

// Get movement of the finger since last frame

Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;

// Move object across XY plane

transform.Translate(-touchDeltaPosition.x *Time.deltaTime, 0, 0);

}

transform.position = new Vector3(Mathf.Clamp(transform.position.x,leftborder,rightborder),transform.position.y,transform.position.z);

}

```

4. 每秒调用:InvokeRepeating(string methodName, float time, float repeatRate)

methodName : 要调用的方法  ;  time:几秒后开始调用  ;  repeatRate:  每几秒调用一次

注意:在Start()中使用

5. 如何通过标签find一个物体 :GameObject.FindGameObjectWithTag()

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

在position处创建一个旋转度为rotation的物体original

7. 触摸输入

1) Input.touchCount  获取触摸点数

2) foreach( Touch touch in Input.touches)  //遍历触摸点数

3) Input.GetTouch(0).phase == TouchPhase.Began  //一旦第一次触摸

PS: GetTouch( int index )    //index是类似触摸数组的指针

8. Vector2.magnitude  :求向量的长度

9.unity中的几种数据存储方式:1)PlayerPrefs 2)ScriptableObjects 3)Databases 4)自定数据文件

10. Unity中所有的UI都要放在Canvas中,不然没法渲染

11. Ui中的Grid Layout Group组件(网格布局组):可以把UI当成组在一起操作。

属性:1.padding(垫充),影响ui组在网格中的的初始位置

          2.Cell Size(单个大小)

        3.Space(cell间隔)

        4.cell组开始布局的角

      5.Start Axis(布局横纵向)

      6.Child Alignment (网格中的布局位置)

12. Canvas中Canvas Scaler组件中的 UI Scale Mode(UI储尺寸模式):1. ConstantPixelSize(尺寸恒定,使用像素大小模式)2. ScaleWithScreenSize(比例随屏幕大小改变模式)3. ConstantPhysicalSize(恒定外形尺寸,由物理单位指定大小)

13. 可以给Text添加outline/shadow组件,给字体添加效果

14. Canvas的子物体如果显示过大,可以通过调节物体scale来调小

15. 物体变大:

```

Another method()

{

StartCoroutine(Scale(new Vector3(0.1f, 0.1f), new Vector3(1, 1)));

}

public IEnumerator Scale(Vector3 from, Vector3 to)

{

float progress = 0;

while (progress <= 1)

{

transform.localScale = Vector3.Lerp(from, to, progress);  //放大

progress += Time.deltaTime;

//print(progress);

yield return null;

}

transform.localScale = to;

}

```

16. 设置物体的可见,可以使用函数 SetActive(bool)

查看它的可见否属性使用 (bool) activeInHierarchy

ps: 如果物体一开始就是not active的,那么程序中将入法直接获取到它。

17. 防御范围可以用 Gizmos类中的Gizmos.DrawWireSphere()设置一个区

18. 鼠标移动屏幕:先设置一个float作为像素高,在if判断中Input.mousePosition的x,y 》= Screen.height – 像素高

19. 滚轮调节视角高度:

先设置一个滚动速度scrollspeed,然后接受一个float scroll来接受Input.GetAxis(“Mouse ScrollWheel”);

然后设置一个Vector3  pos接受相机位置;然后设置它pos.y -= scroll * sccrollspeed * Time.deltatime;

注意要限制相机的上下界, 用clamp()函数。

20. Physics.OverlapSphere:返回所有在区域区域中的collider[];

21. 快速调节物体到另一个物体的位置上:右击物体的Transform组件,选择copy component

22. 将实例化的对象放在一个空对象下:virus.transform.parent = Virusparent.transform;

23. 物体调成Debug模式时可以看到脚本参数的变化

24. 暂停和继续:Time.timeScale = 0f; Time.timeScale = 1f;

25. 场景的加载: 调用UnityEngin.SceneManager中的LoadScene(string)函数,通过改变string实现想不同场景的跳转。

**重新开始**:SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);    调用当前活跃的场景。同时要设置        Time.timeScale = 1f;

26. Panel的淡入淡出:  给panel加一个Canvase Group和animator组件,在animation中创建新动画,点选一个时间点将canvase group中的Alpha设置为0或1;

27. 给按钮加点击动画:将Button组件中的transition选项调成Animation,然后设置四个按钮状态的动画

28. 使用协程:StartCoroutine(method());

IEnumerator method(){ yield return WaitForSeconds()}    协程和线程跳转有点像,在wait阶段将程序控制权交出,执行外部代码,当wait阶段完成后拿回控制权继续执行本段后续代码

29. canvas 中UI的自适应:把锚点拖到对应的四个蓝色实心点上。更改canvas scaler属性为如图:    其中Match为0时表示竖屏,1时表示横屏

30. 场景自适应问题:改变相机视口。

实际视口 = 初始视口 * 初始高宽比 / 实际高宽比

31.实现场景的淡入淡出效果

首先创建一个canvas,在其下创建一个image 并自定义它的颜色。

然后写一个脚本贴在canvas 上。

脚本中需要拿到image,并且声明一个AnimationCurve .在Start 中使用协程调用淡入、淡出函数。

31. 在update()中调用有协程的函数注意点“:

因为是每帧调用的所以要设置一个bool判断条件再调用有协程的函数,并且随后置反,再协程中再置回。

32. 实现血条:添加Slider,将canvas的坐标改为世界坐标,Slider中的子类物体只留下Fill 和background ,并将Fill置为background子类,将Fill的Stretch改为随父类大小:Alt + 右下角最后一个。通过修改COLOR设置前置,后置背景的颜色。另外,如果是实现环形血条,只要把Fill Area下的Fill对象的Source Image设置为你预先准备好的环形血槽图片,然后把Image Type改为Filled,Fill Method改为Radial 360.即可

33. 单机游戏储存内容小,所以可以使用assess数据库。Access是一种只适合数据量少的应用的桌面数据库,处理少量和单机访问的数据库时效率会很高。

34. 使用DontDestoryOnLoad()时,要确保依附对象为单例模式。避免重复生成对象。最直观的反例就是场景切换后背景音乐重叠

35.实现粒子系统检测碰撞时,勾选粒子系统下的Trigger选项条,然后设置Collider对象(被检测对象),inside,ouside,enter,exit为触发条件(即粒子在对象的各种情况下时触发)。可以选择满足条件后对应的反应(ignore,kill,callback),ignore为无反应,kill为消除触发粒子,callback是自定义反应。要实现callback要在对应的新建脚本中使用ParticlePhysicsExtensions.GetTriggerParticles()(以及你要指定的ParticleSystemTriggerEventType)来确定哪些粒子满足哪些条件。然后将脚本挂载在对应粒子系统上。详情见文档。

36.Physics.Raycast只能用于检测3d碰撞,如果要射线检测2d碰撞用Physics2D.Raycast

37.【四种坐标系的转换】

1、世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。

2、屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。

3、视口坐标→屏幕坐标:camera.ViewportToScreenPoint();

4、视口坐标→世界坐标:camera.ViewportToWorldPoint();

5. 绝对坐标转相对坐标 InverseTransformPoint(transform.position);

Debug.Log(vec);//打印出来是(0,0,0);与上面不一样

6.   相对坐标转绝对坐标      transform.TransformPoint(transform.localposition);

38.铰链(hinge joint)

39.animation播放动画:If you select your animation in theProjectwindow, then go to the top right corner of theInspectorwindow and selectDebugfrom the drop down menu (next to the lock), then change theAnimation Typeto 1 will mark it as Legacy.

40.**UI字体缩小模糊**:canvas渲染模式调成世界空间,scale factor/Dynamic Pixel调大些

41.碰撞器之间会相互影响,设置其Layer有助于物理分类

42.Project Setting中的TixedTimeStep :值越小,物理计算越频繁

43.我们以前所玩的游戏中,主人公身上依附着一只宠物如鹰,主人公移动时,鹰会跟随着飞动,主人公移动得快它就飞行跟动得快,始终不会离开主人公,使用Lerp插值函数就可实现。

44.Transform中eularAngle的取值范围是(0,360).

45. 更改天空盒可以在lighting设置中完成

46.通过脚本使用SetActive的注意点:不可以直接由GameObject.Find来设置可见性,而是应该通过GameObject.Find("可见父类物体名").transform.Find("不可见子物体名")来设置可见性。还有一种是通过public指定实现,较为常用。

47.EventSystem.current.currentSelectedGameObject.name 获取点击物体的名字

48.通过脚本绑定点击事件:Button.onClick.AddListener

49.unity中的CPU帧率低了会有一种卡的感觉,高了会对性能要求高。适合的是30-60fps

50.两次点击退出

```

if (Input.GetKeyDown(KeyCode.Escape))

        {

            clickTimes++;

           if (clickTimes == 1) {

    i1 = Time.time;

            }

            if (clickTimes == 2)

            {

                i2 = Time.time;

                if (i2 - i1 <= 2f)

                    Application.Quit();

            }

        }

```

51.动态更改材质 在MeshRenderer组件下的属性中

52. 简单的单例模式:

```

public static Manager instance = null;

void Awake()

    {

        if (instance != null)

            return;

        instance = this;

    }

```

53. 线性插值理解

插值有三个参数(起始,终点,百分比)。百分比定义**移动步长【(终点 - 起始)*百分比】**。它的应用有Mathf.Lerp。Vector,Color下的Lerp函数本质是相同的。可以通过Lerp函数给目标值循环赋值,能实现线性变化。

```

voidUpdate ()

//以帧为变化频率

 light.intensity=Mathf.Lerp(light.intensity,8f, 0.5f);

//以时间为变化频率

light.intensity=Mathf.Lerp(light.intensity,8f, 0.5f*Time.deltaTime);

}

```


54.以自身坐标做移动。transform.Translate(Vector3 , Space.Self)

你可能感兴趣的:(unity3d小技巧)