unity3D游戏开发文档|unity学习笔记(持续更新)
unity学习笔记(持续更新)
1.点哪指向哪
if (Input.GetMouseButtonDown(0))
{
//相机向指定的物体发出射线,并返回
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//射线可以跟collider组件的物体发生碰撞
RaycastHit hit;
//碰撞的信息//表示是否碰到东西
if (Physics.Raycast(ray, out hit))
{
transform.LookAt(new Vector3(hit.point.x, transform.position.y, hit.point.z));
}
}
2.物体的旋转
#region 方法一
//设置炮台方向跟小球一个方向
//transform.forward = ball.position - transform.position;
#endregion#region 方法二
// transform.LookAt(ball);
#endregion//Vector3.Angle得到的夹角只会返回正夹角
#region 方法二 改旋转
//改旋转轴
// Vector3 ballPos = ball.position - transform.position;
// float angle = Vector3.Angle(ballPos,dir);
Vector3 axis = Vector3.Cross(dir, ballPos);
// dir = ballPos;
// //dir = new Vector3(ballPos.x, 0, ballPos.z);
// transform.Rotate(Vector3.up, angle);
// transform.Rotate(axis, angle);
//改旋转角度
Vector3 ballPos = ball.position - transform.position;
float angle = Vector3.Angle(ballPos,dir);
Vector3 axis = Vector3.Cross(dir, ballPos);
float result = Vector3.Dot(axis, Vector3.up);
//根据传入值的符号返回,如果传入的值为负,则返回-1,否则返回1
result = Mathf.Sign(result);
dir = ballPos;
angle *= result;
transform.Rotate(Vector3.up, angle);
3.键盘事件
【unity3D游戏开发文档|unity学习笔记(持续更新)】键盘输入
Input.GetKey
长安一个键不放,每帧判断一次
Input.GetKeyDown
按下某个键,只判断一次
Input.GetKeyUp
松开某个键,只判断一次
if (Input.GetKeyUp(KeyCode.W))
{
Debug.Log("往前走");
}if (Input.GetKeyDown(KeyCode.A))
{
transform.Translate(new Vector3(-speed, 0, 0));
Debug.Log("往左走");
}if (Input.GetKeyDown(KeyCode.D))
{
transform.Translate(new Vector3(speed, 0, 0));
Debug.Log("往右走");
}if (Input.GetKeyDown(KeyCode.S))
{
transform.Translate(new Vector3(0, 0, -speed));
Debug.Log("往下走");
}
4.鼠标事件
鼠标输入
Input.GetMouseButton
按住不放 每帧判断
Input.GetMouseButtonDown
点击时 判断一次
Input.GetMouseButtonUp
松开时 判断一次
0代表鼠标左键,1代表右键,2代表中键
if (Input.GetMouseButtonDown(0))
{
print("点击左键");
}if (Input.GetMouseButtonDown(0))
{
print("点击右键");
}if (Input.GetMouseButtonDown(0))
{
print("点击中键");
}
5.通过GUI代码改
ui
//OnGUI为每帧执行
private void OnGUI()
{
GUIStyle style = new GUIStyle();
style.fontSize = 20;
style.normal.textColor = Color.blue;
GUI.Label(new Rect(0, 0, 500, 300), "得分:"+ sum,style);
} private void OnGUI()
{
if( GUI.Button(new Rect(Screen.width / 2 - width / 2, Screen.height / 2 - height / 2, width, height), "开始游戏"))
{
SceneManager.LoadScene(1);
}
}
6.场景的切换
1.引入命名空间
using UnityEngine.SceneManagement;
2.场景跳转
SceneManager.LoadScene("SampleScene");
7.物理碰撞
private void OnCollisionEnter(Collision collision){}
8.普通的碰撞
private void OnTriggerEnter(Collider other){}
9.公转
transform.RotateAround(target.position, Vector3.up, angle * Time.deltaTime);
10.物体跟随鼠标转
Vector3 mousePos;
public float rate;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
mousePos = Input.mousePosition;
}if (Input.GetMouseButton(0))
{
//鼠标移动的偏移量
Vector3 offest = Input.mousePosition - mousePos;
//旋转物体
transform.eulerAngles += Vector3.down * offest.x * rate;
mousePos = Input.mousePosition;
}
}
11.获取子节点在父节点下的坐标 字符节点的操作都是在
transfrom
组件上完成的//通过下标获取子节点
transform.GetChild(index)GameObject.Find("needles").transform.GetChild(0).position = new Vector3(0, 0.7f, -5);
//获取子节点在父节点下的下标
transform.GetSiblingIndex();
//子节点的个数
transform.childCount
12.给物体给力让其运动
if (Input.GetKey(KeyCode.A))
{
GetComponent().AddForce(Vector3.left * v);
}
if (Input.GetKey(KeyCode.S))
{
GetComponent().AddForce(Vector3.back * v);
}
if (Input.GetKey(KeyCode.D))
{
GetComponent().AddForce(Vector3.right * v);
}if (Input.GetKeyDown(KeyCode.Space))
{
GetComponent().AddForce(Vector3.up * v * 30);
}
13.计时器
Invoke("spinDrop", 1.0f);
14.世界坐标转本地坐标
Vector3 dir = new Vector3(horizontal, 0, vertical);
//将世界坐标转换成本地坐标
dir = transform.TransformDirection(dir);
15.控制一个值的最大值和最小值,即范围
xAngle = Mathf.Clamp(xAngle, yMin, yMax);
16.代码控制动画
Play("ation 1" );
,播放动画,传入参数为动画名字
Stop("ation 1") ,停止动画,传入参数为动画名字CrossFade("ation 1", 0.5f);
,有过度的切换动画,传入参数(动画名字,过度时间)
17.隐藏鼠标
//隐藏锁定鼠标
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
18.节点的销毁
Destroy(this.gameObject,1);
//1秒后销毁
19.查找节点
//从当前场景中所有的物体里寻找叫这个名字的物体返回值是GameObject类型
// 找到第一个同名的节点,费性能,概率性找不到,可能会有多个重名的物体
GameObject.Find()//从transfrom组件的子物体中寻找叫这个名字的物体,找不到孙子节点返回值是Transfrom类型
transfrom.Find()
20.
Gizmos
标记
//和update类似,也是每帧调用一次
//OnDrawGizmos是在代码编译完成时开始执行
private void OnDrawGizmos()
{
//Gizmos.DrawCube(Vector3.zero, Vector3.one);
Gizmos.color = Color.red;
for (int i = 0;
i < points.Length - 1;
i++)
{
Gizmos.DrawLine(points[i].position, points[i + 1].position);
}
}
21.数据本地保存
PlayerPrefs.SetInt("num",num);
PlayerPrefs.GetInt("num",0);
22.代码绑定按钮点击事件
//只能是无参无返回值的函数
GetComponent
25.高亮的实现 https://www.jianshu.com/p/23fb2f6fcfa0
26.防止射线点击
ui
的时候穿透
EventSystem.current.IsPointerOverGameObject()如果当前鼠标在 ui 上返回true 否则返回false
27.关于脚本组件属性的注释
[Header("两次巡逻的间隔时间")] //注释
public float patrol_waite_time = 3;
//两次巡逻的间隔时间[SerializeField] //在面板显示私有的属性
float timer;
//实现计时器的参数
推荐阅读
- 深入理解Go之generate
- 游戏IP(立足于玩家情感的粉丝经济)
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 人生游戏--是游戏,还是人生()
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- (小说)月流水几亿的火爆游戏养成记
- 游戏治愈了我无聊之症
- 我的软件测试开发工程师书单
- echart|echart 双轴图开发
- 生活与游戏日记(第182篇)(〔成长瞬间〕关注解决问题2019.10)