在unity开发过程中,会遇到很多问题,在这篇博客里记载我遇到的问题和解决方案~~
长期更新~~
Q1. 碰撞体与碰撞体之间忽略碰撞
问题描述:我在一辆小车上新加了一个碰撞体,由于车自带有碰撞体,两者发生碰撞导致小车严重抖动。发现把物体设为车的子物体也无法解决,后想到了忽略碰撞。
解决方案如下:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public Transform bulletPrefab;
void Start() {
Transform bullet = Instantiate(bulletPrefab) as Transform;
Physics.IgnoreCollision(bullet.GetComponent<Collider>(), GetComponent<Collider>());
}
}
注意到两物体都有collider
,用到的函数是Physics.IgnoreCollision
。
Q2. get和set方法解决对类的成员变量访问
问题描述:这类情况经常见到,包括我在看别人代码时不明白get和set用来干什么。怎么理解呢?
在类的定义中,通常定义了很多public
变量,还有很多private
变量,对于成员函数来说,它们都是可以访问的,而对于非成员函数来说,private变量
它是没有权限访问,当然,有时我们确实需要对这些private访问和操作。C++的解决办法是使用友元函数
,C#和Java使用get和set方法,具体如下:
class Person
{
private char name;
private int age;
public char Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
}
注意到定义的属性名Name
和私有变量name
不同名,非成员函数访问时直接访问Name
变量即可(相当于自定义变量)
在定义的时候可以只定义一个get方法或只定义一个set方法。如果只定义get方法
,那么这个相应变量就是“只读
”的;如果只定义set方法
,那么相应变量就是“只写
”的。都有的话当然是可读可写
,这样我们就可以控制对变量的读写操作。
Q3. 判断哪个平台并执行相应代码
问题描述:经常看到看到代码中有灰色部分,多以#if #else if #endif 开头,这些都是什么意思呢?
answer: 源文件在进行编译之前要进行一次文件处理,这是由预处理器完成的。这种文件处理只对源文件进行文本处理而不进行任何编译动作。所有预处理指令都以“#”符号开头。
最常见的如下
#if UNITY_ANDROID
Debug.Log("这里是安卓设备^_^");
#endif
#if UNITY_IPHONE
Debug.Log("这里是苹果设备>_<");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("我是从Windows的电脑上运行的T_T");
#endif
区分是安卓、apple、还是pc,并分别执行相应代码
还有:
#region Events
public Action OnGraphicalUpdate = () => { };
public Action OnPrePhysicalUpdate = () => { };
public Action OnPostPhysicalUpdate = () => { };
#endregion
#region
一个分块预处理命令,它主要用于编辑代码的分段,在编译时会被自动删除。它必须以#endregion
结束。 #region块
不能与#if块
重叠。但是,可以将#region块
嵌套在#if块
内,或将#if块
嵌套在#region块
内。#region
后面的Events
是来描述这段代码是用来干什么的。使用这个命令会使你的代码看上去干净很多。
#Q4.