这是以前刚开始学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)