1.获取相机射线
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = ray.GetPoint(10.0f);
transform.LookAt(ray.GetPoint(10.0f));
2.AddForce和velocity有什么区别?
AddForce是施加一个力,这样运动是靠力产生的加速度,然后就加速前进。
直接使用Velocity,速度很平稳,移动为恒定值,相当于直接给设定了一个恒定的速度。
3.检测哪个按键被按下
public void DetectPressedKeyOrButton()
{
foreach (KeyCode kcode in Enum.GetValues(typeof(KeyCode)))
{
if (Input.GetKeyDown(kcode))
{
Debug.Log("KeyCode down: " + kcode);
}
}
}
4.在控制面板上查看脚本的私有变量
选中你的脚本文件,然后右键点击Inspector,默认是Normal改成Debug
5.锁定检视面板
当需要拖拽对象至检视面板时,常常会因为操作原因导致检视面板的内容已经改变了。这时可以点击检视面板右上方的锁图标,锁定检视面板,这样不论其它视图如何切换,检视面板都会显示固定内容
6.若脚本出错导致不能进入运行模式,不妨这样试一试
如果脚本出现错误,Unity编辑器会因为检查到出错而无法进入运行模式,这时可以在项目视图中新建文件夹WebplayerTemplates,然后将出错的脚本拖入此文件夹下,所有位于该文件夹下的文件都会被识别为一般文件从而不会当作脚本被编译,这样就可以运行游戏了。
我喜欢这个。也蛮有用的。
7.在固定的事件调用某个函数(这里拿Abc函数为例子)
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Rigidbody projectile;
void Abc() {
Rigidbody instance = Instantiate(projectile);
instance.velocity = Random.insideUnitSphere * 5;
}
public void Awake() {
Invoke("Abc", 2);
}
}
8.每隔一定时间调用一次methodName函数
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Rigidbody projectile;
void LaunchProjectile() {
Rigidbody instance = Instantiate(projectile);
instance.velocity = Random.insideUnitSphere * 5;
}
public void Awake() {
InvokeRepeating("LaunchProjectile", 2, 0.3F); //2秒后,没0.3f调用一次
}
}
9.单例模式的使用
using UnityEngine;
using System.Collections;
public class ModelLocator {
public string myString;
private static ModelLocator instance;
public static ModelLocator getInstance{
get{
if(instance==null){
instance=new ModelLocator();
}
return instance;
}
}
}
10.脚本的声明周期
Awake:在游戏运行时调用,用于初始化。
Start : 只在游戏开始时执行一次,在Awake()函数后执行; Update:在游戏每一帧都执行一次,在Start()函数后执行; LateUpdate:同Update,只是它会在Update()函数执行后再执行; FixedUpdate:当游戏中引入刚体系统,使用适配的方式同步物理时钟,可以让动力学更精确的计算; OnGUI:绘制游戏界面的函数,因为每一帧执行多次,所以一些时间相关的函数要尽量避免直接在其内部使用。 OnMouseOver:鼠标停留在物体上时执行该函数的内容。 OnMouseEnter:鼠标进入物体范围时执行该函数的内容。和OnMouseOver不同,该函数只执行一次。 OnMouseExit:鼠标离开物体范围时执行该函数的内容。 OnMouseDown:鼠标按下时执行该函数的内容。 OnMouseUp:当鼠标释放时执行该函数的内容。 OnMouseDrag:按住鼠标拖动时执行该函数的内容。
11.Random类(随机数
float a=Random.value;
int b=Random.Range(0,100) 包括最大和最小
float c=Random.Range(0.0f,1.0f); 包括最小但不包括最大
12.Yield Return
//Yield语句是一种特殊类型的Return(返回)语句,它可以确保函数在下一次被执行时,不是从头开始,而是从Yield语句处开始。
//可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行
void Start () {
print("Start开始");
StartCoroutine("Do");
print("Do调用后");
}
IEnumerator Do(){
print("Do开始");
yield return new WaitForSeconds(3.0f);
print("暂停3秒后");
}
运行结果为:Start开始–》Do开始—》Do调用后—》暂停3秒后
13.旋转和移动
transform.Rotate(new Vector3(x,y,z));
transform.Translate(new Vector3(x,y,z));
14.判断两个物体之间的距离
Vector3.Distance( position1,position2);
//position1 和position2是需要判断的两个物体transform的position,distance是距离
15.Vector3的使用
//vector3.Project求某个向量在某个方向的投影向量(向量,方向)
float speed = Vector3.Project(agent.desiredVelocity, transform.forward).magnitude;
//Vector3.Angle求两个向量的夹角
float angularSpeed = Vector3.Angle(agent.desiredVelocity, transform.forward);
//角度*mathf.deg2rad 角度转为弧度
//弧度*mathf.rad2deg 弧度转为角度
angular *= Mathf.Deg2Rad
//Vector3.Cross 求两个向量的法向量
Vector3 normal = Vector3.Cross(transform.forward, agent.desiredVelocity);