unity学习手册@@huzicpp

unity资料

注:目录是乱序的,因为是我根据我学习的次序来整理的,所以不太好看。照着目录来找需要的内容吧。
资料参考书下载

unity环境搭建

  1. 在官网下载unity版本和hub,下载完成之后用hub激活unity。
  2. 安装unity的adriod支持包,在file–>build setting 中。安装路径与editor平级即可。
  3. 在unity的edit中设置jdk,sdk(andrio_studio中的)路径设置好。

unity必备工具

  1. 利用骨骼制作人物动作,anima2D,在access商店可以获得。b站教程unity + anima2D制作角色的Idle动作

unity背景设计

  1. 切片
    暂时不知道切片怎么切,但是不切片的图片不能用
  2. 摄像头
    右击设置摄像头,可以调节摄像头的大小为10,让范围更大。
  3. crl+s
    必须每次做完更改都要保存。
  4. 在gameobject选择2dobject
    选择tilemap,相当一个场景布置器
  5. 场景分三层,第一次放背景,如蓝天啊什么的。第二层放bound,边界,角色不能超过的范围。第三层是前景,可能发生交互的地方。需要三个tilemap。
  6. 分别修改三个tilemap的order in gird,使得重合的地方不会看不到另外一个场景
  7. 在window选项中选择2D中的tile palette,打开这个窗口。创建一个新的palette,将切好片的图片拖进tile palette,保存。
  8. pixels in unit的设置大小要和图片像素一样,防止画图的时候变小。
  9. 画图,直接用tile palette的图,来绘制场景

控制人物移动和跳动

  1. 在主场景中添加人物。把人物的一系列的静止状态图拖入hierachy中,把inspector中添加一个新的排序layer, 把人物放到新的排序中。
  2. 给人物加主键rigidbody2D,把人物变成刚体,把z轴变成freeze rotation,锁定z轴。
  3. 给人物加一个碰撞盒box collider 2D,调整范围为我们可以控制的范围(框框)
  4. 建立碰撞检测机制:tilemap collider 2d,给各个需要的场景加上碰撞检测机制。
    建立动画
  5. 点击player,在window找animation的animation。选择player,点击create,创建一个动画。
  6. 找到idle下的动画的帧,全部拖到轴上,然后播放,按crl可以选择头和尾,然后方长动画。这个人物其他动画的创建也是相同的道理,新建一个动画,然后播放。
  7. 控制动画转换:在access(新建的文件夹下)给角色的一些列动画创建一个组,方便后期管理。点击方框图标的player。关闭exit time和fixed。。会变得比较流畅。转换动画在parameter,用值来表示。然后在箭头设置的condition添加控制。写脚本来控制值,创建一个文件夹,命名为scripts。新建一个player脚本,然后像添加刚体属性那样把脚本绑定到player上。
  8. 脚本编辑,创建一些参数变量,设置为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,代码如下:

有关脚本设计的注意

  1. 声明为public的变量不用直接初始化,可以通过图形化界面来导入这些变量。
  2. 声明为static的变量可以全局访问,实例化只有一次。
  3. 脚本实际上就是对变量属性的操作,方法的调用。需要知道方法,要记住方法。

Button设计

  1. 打开unity3d项目“GameObject” → \rightarrow “UI” → \rightarrow “Button”,创建一个按钮。

  2. 在“Rect Transform”下可以改变按钮的布局位置大小等。

  3. 在“Image (Script)”与“Button(Script)”中可以更详细的设置按钮的颜色等效果。

  4. 展开Button在其中的“Text”中的“Text(Script)”中可以设置按钮显示文字信息。

  5. 新建一个文件夹“Script”在里面新建一个“Button_test”的脚本,打开后在里面添加一个方法

public  void  Click_test(){

       Debug.Log("点击测试");

}
  1. 把编辑好的“Button_test”脚本添加到场景中的Button上。

  2. 点击“On Click ()”下的“+”添加,然后Object中选择添加“Button”。(有两个选择,一个是asset,一个是sence,button应该在sence中)

  3. 点击“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角色需要精灵,图块集。精灵是覆盖在人物表面的,图块集是由多个图片组成的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值