unity资料
注:目录是乱序的,因为是我根据我学习的次序来整理的,所以不太好看。照着目录来找需要的内容吧。
资料参考书下载
unity环境搭建
- 在官网下载unity版本和hub,下载完成之后用hub激活unity。
- 安装unity的adriod支持包,在file–>build setting 中。安装路径与editor平级即可。
- 在unity的edit中设置jdk,sdk(andrio_studio中的)路径设置好。
unity必备工具
- 利用骨骼制作人物动作,anima2D,在access商店可以获得。b站教程unity + anima2D制作角色的Idle动作
unity背景设计
- 切片
暂时不知道切片怎么切,但是不切片的图片不能用 - 摄像头
右击设置摄像头,可以调节摄像头的大小为10,让范围更大。 - crl+s
必须每次做完更改都要保存。 - 在gameobject选择2dobject
选择tilemap,相当一个场景布置器 - 场景分三层,第一次放背景,如蓝天啊什么的。第二层放bound,边界,角色不能超过的范围。第三层是前景,可能发生交互的地方。需要三个tilemap。
- 分别修改三个tilemap的order in gird,使得重合的地方不会看不到另外一个场景
- 在window选项中选择2D中的tile palette,打开这个窗口。创建一个新的palette,将切好片的图片拖进tile palette,保存。
- pixels in unit的设置大小要和图片像素一样,防止画图的时候变小。
- 画图,直接用tile palette的图,来绘制场景
控制人物移动和跳动
- 在主场景中添加人物。把人物的一系列的静止状态图拖入hierachy中,把inspector中添加一个新的排序layer, 把人物放到新的排序中。
- 给人物加主键rigidbody2D,把人物变成刚体,把z轴变成freeze rotation,锁定z轴。
- 给人物加一个碰撞盒box collider 2D,调整范围为我们可以控制的范围(框框)
- 建立碰撞检测机制:tilemap collider 2d,给各个需要的场景加上碰撞检测机制。
建立动画 - 点击player,在window找animation的animation。选择player,点击create,创建一个动画。
- 找到idle下的动画的帧,全部拖到轴上,然后播放,按crl可以选择头和尾,然后方长动画。这个人物其他动画的创建也是相同的道理,新建一个动画,然后播放。
- 控制动画转换:在access(新建的文件夹下)给角色的一些列动画创建一个组,方便后期管理。点击方框图标的player。关闭exit time和fixed。。会变得比较流畅。转换动画在parameter,用值来表示。然后在箭头设置的condition添加控制。写脚本来控制值,创建一个文件夹,命名为scripts。新建一个player脚本,然后像添加刚体属性那样把脚本绑定到player上。
- 脚本编辑,创建一些参数变量,设置为public,可以在外部编辑。在以private声明刚体变量和动画控制器。在update中编写动作变量。用三维的向量来表示,因为本质上还是一个3d软件。
人物移动的脚本完整代码(增加一个摄像头跟随,添加主摄像头即可):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class judgeRun : MonoBehaviour
{
public float runSpeed = 7;
private Animator animator;
private Rigidbody2D _rigidbody2D;
private float moveX, moveY;
public Camera myCamera;
private Vector3 offset;
// Start is called before the first frame update
void Start()
{
_rigidbody2D = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
offset = _rigidbody2D.transform.position;
}
// Update is called once per frame
void Update()
{
moveX = Input.GetAxis("Horizontal");
moveY = Input.GetAxis("Vertical");
Run();
if(moveX > 0)
{
_rigidbody2D.transform.eulerAngles = new Vector3(0f, 0f, 0f);
animator.SetBool(name: "isRun", value: true);
}
if (moveX < 0)
{
_rigidbody2D.transform.eulerAngles = new Vector3(0f, 180f, 0f);
animator.SetBool(name: "isRun", value: true);
}
if (moveX < 0.00001 && moveX >-0.00001)
{
animator.SetBool(name: "isRun", value: false);
}
}
void Run()
{
Vector3 move = new Vector3(moveX, moveY, 0f);
_rigidbody2D.transform.position += move * runSpeed * Time.deltaTime;
}
private void LateUpdate() //不会人物不动了但是摄像头还在动
{
myCamera.transform.position += _rigidbody2D.transform.position - offset;
offset = _rigidbody2D.transform.position;
}
}
人物的跳跃只需要用脚本来实现。首先实现一个基本的跳跃:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Jump : MonoBehaviour
{
// Start is called before the first frame update
public float jumpHigh = 5f;
private Rigidbody2D _rigidbody2D;
private bool jumpJudge = false;
public Camera myCamera;
private Vector3 offset;
void Start()
{
_rigidbody2D = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Jump"))
{
jumpJudge = true;
}
}
private void FixedUpdate()
{
if (jumpJudge)
{
_rigidbody2D.AddForce(Vector2.up * jumpHigh, ForceMode2D.Force); //叠加的方式来跳
jumpJudge = false;
}
}
}
注意box collider2d可能会在游戏边界上卡住,所以换成capsule collider会比较好
跳跃触地检测
添加一个触地检测盒,自建的盒子,创建一个脚本jumpbox,代码如下:
有关脚本设计的注意
- 声明为public的变量不用直接初始化,可以通过图形化界面来导入这些变量。
- 声明为static的变量可以全局访问,实例化只有一次。
- 脚本实际上就是对变量属性的操作,方法的调用。需要知道方法,要记住方法。
Button设计
-
打开unity3d项目“GameObject” → \rightarrow →“UI” → \rightarrow →“Button”,创建一个按钮。
-
在“Rect Transform”下可以改变按钮的布局位置大小等。
-
在“Image (Script)”与“Button(Script)”中可以更详细的设置按钮的颜色等效果。
-
展开Button在其中的“Text”中的“Text(Script)”中可以设置按钮显示文字信息。
-
新建一个文件夹“Script”在里面新建一个“Button_test”的脚本,打开后在里面添加一个方法
public void Click_test(){
Debug.Log("点击测试");
}
-
把编辑好的“Button_test”脚本添加到场景中的Button上。
-
点击“On Click ()”下的“+”添加,然后Object中选择添加“Button”。(有两个选择,一个是asset,一个是sence,button应该在sence中)
-
点击“No Function”选择“Button_test”–“Click_test ()”,保存后运行,点击按钮旧可以调用脚本中我们定义的Click_test ()方法,输出“点击测试”。
方法参考于百度,官方文档套娃严重太麻烦了。
使用编辑器类自定义编辑器
文件结构:Editor
→
\rightarrow
→ 脚本名
实例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; //需要加上,因为要使用到那个类
public class first : ScriptableWizard //改为ScriptableWizard
{
[MenuItem("MyNewname/Batch Rename...")] //菜单显示方式
static void CreateWizard() //创建菜单项
{
ScriptableWizard.DisplayWizard("Batch Rename", typeof(first), "wo"); //第三个方法是按钮名
}
}
显示选中的场景中的对象数量
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; //需要加上,因为要使用到那个类
public class first : ScriptableWizard //改为ScriptableWizard
{
private void OnEnable() //继承自ScriptableWizard,当工具窗口第一次出现时被调用,也就是单击batch rename时调用
{
UpdateSelectionHelper();
}
private void OnSelectionChange() //当场景中选择发生改变时被调用(实时显示数量)
{
UpdateSelectionHelper();
}
void UpdateSelectionHelper() //使用helpstring显示选中对象个数信息
{
helpString = "";
if(Selection.objects != null)
{
helpString = "number of objects selected:" + Selection.objects.Length;
}
}
}
设置窗口,用户输入框
public class first : ScriptableWizard //改为ScriptableWizard
{
//名称前缀
public string Basename = "Myobject_";
//起始号码
public int Startnumber = 0;
//递增值
public int Increment = 1;
[MenuItem("MyNewname/Batch Rename...")] //菜单显示方式
static void CreateWizard() //创建菜单项
{
ScriptableWizard.DisplayWizard("Batch Rename", typeof(first), "renname"); //第三个方法是按钮名
}
}
注,不是public属性都可以被识别显示,必须是课串行化的,可以加Serializable
来实现串行化
批量修改对象名完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; //需要加上,因为要使用到那个类
using UnityEngine.EventSystems;
using System;
public class first : ScriptableWizard //改为ScriptableWizard
{
//名称前缀
public string Basename = "Myobject_";
//起始号码
public int Startnumber = 0;
//递增值
public int Increment = 1;
[MenuItem("MyNewname/Batch Rename...")] //菜单显示方式
static void CreateWizard() //创建菜单项
{
ScriptableWizard.DisplayWizard("Batch Rename", typeof(first), "renname"); //第三个方法是按钮名
}
private void OnEnable() //继承自ScriptableWizard,当工具窗口第一次出现时被调用,也就是单击batch rename时调用
{
UpdateSelectionHelper();
}
private void OnSelectionChange() //当场景中选择发生改变时被调用
{
UpdateSelectionHelper();
}
void UpdateSelectionHelper() //使用helpstring显示选中对象个数信息
{
helpString = "";
if(Selection.objects != null)
{
helpString = "number of objects selected:" + Selection.objects.Length;
}
}
private void OnWizardCreate()
{
if (Selection.objects == null) return;
//使用者输入起始数字
int PostFix = Startnumber;
foreach(UnityEngine.Object o in Selection.objects)
{
o.name = Basename + PostFix;
PostFix += Increment;
}
}
}
制作2d角色需要精灵,图块集。精灵是覆盖在人物表面的,图块集是由多个图片组成的。