初识unity之第三天

碰撞体组件collider

两个物体发生碰撞,实际上产生碰撞的是两个碰撞体
edit collider---修改碰撞体


clipboard.png

clipboard.png

当碰撞体边框碰到物体的时候会产生效果


clipboard.png

当一个cube的碰撞体是使用的球形碰撞体,那么物理性质也会是球的表现形式

物理材质

新建的一个物理材质有如下属性:


clipboard.png

动态摩擦力(dynamic friction)
静态摩擦力(static friction)
弹力 (bounciness)
组合摩擦力
组合弹力

角色移动控制

由于我的unity里面没有人物模型因此需要在unity商店中找一个免费的资源,简述一下如何在商店中购买资源以及引用到unity中。

1,首先找到一个免费的资源包,然后购买


clipboard.png

2,购买之后点击 open in unity
3,当unity中打开了package manager之后,再依次点击download 和 import


clipboard.png

clipboard.png

素材导入成功!
clipboard.png

可以看到模型和预设体都在这个文件目录里面了,然后我们看一下模型的格式----一般来说unity官方推荐的模型格式为fbx


clipboard.png

可以直接将预设体拖到场景当中
clipboard.png

模型的Z轴一般来说都是移动的前方,因此在选用模型的时候尽量选择Z轴是模型前方的模型,以方便写代码。
clipboard.png

不同的预设体有不同的动作表示
clipboard.png

clipboard.png

动作控制器---不同的动作可以通过不同的动作控制器实现,,

游戏脚本

游戏角色需要少量代码来控制游戏角色的控制,以及物品控制。
右键--》新建游戏脚本==》C#


clipboard.png

比如说我们要控制角色移动,那么我们应该知道是通过的什么方式控制的,可以是键盘也可以是摇杆手柄。如果是摇杆手柄。那么如下图:


clipboard.png

可以通过三角公式求遥感移动的方向以及距离。或者通过求向量来控制角色移动,显然后者更简单,因此有一下代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        //算出方向向量
        Vector3 direction = new Vector3(horizontal,0,vertical);

        if (direction != Vector3.zero) {
            //将游戏角色转至指定的方向
            transform.rotation = Quaternion.LookRotation(direction);
            //将游戏对象移动
            transform.Translate(Vector3.forward * 1 * Time.deltaTime);

        }}}

写完之后可以添加到角色整体模型上之后就可以控制角色移动了


clipboard.png

然后还可以使用CrossFade播放动作效果,但是前提是模型采用的动画组件是Animation

transform.GetComponent<Animation>().CrossFade("Idle");

如果是其他的动画组件例如:Animator 方法就不同了
首先需要新建一个 Animator controlller 然后构建状态机


clipboard.png

这些状态机中 entry是链接的一个 默认的状态,anyState是任意状态中切换过来,善用anystate可以节约很大的逻辑量,构建好状态机后,以下代码为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{

    private Animator animator;

    // Start is called before the first frame update
    void Start()
    {}

    // Update is called once per frame
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        //算出方向向量
        Vector3 direction = new Vector3(horizontal,0,vertical);
        
        if (direction != Vector3.zero)
        {

            //让角色做走的动画           
            transform.GetComponent<Animator>().SetInteger("walkState", 1);
            //将游戏角色转至指定的方向
            transform.rotation = Quaternion.LookRotation(direction);
            //将游戏对象移动
            transform.Translate(Vector3.forward * 1 * Time.deltaTime);

        }
        else {
            //让角色站立的动画
            //transform.GetComponent<Animation>().CrossFade("Idle01");  当游戏角色采用的是 animation 属性的时候使用

            transform.GetComponent<Animator>().SetInteger("walkState", 0);
        }   }}

由于这里想到可以构建一个游戏角色完整的动画因此我花了一点时间构建了一个游戏角色比较完整的动画,代码如下:


clipboard.png
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{

    private Animator animator;

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("游戏启动");
    }

    void walk(int speed, Vector3 direction) {


        //将游戏角色转至指定的方向
        transform.rotation = Quaternion.LookRotation(direction);
        //将游戏对象移动
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }

    // Update is called once per frame
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        //算出方向向量
        Vector3 direction = new Vector3(horizontal,0,vertical);

       

        if (direction != Vector3.zero)
        {

            //计算向量距离长度
            Debug.Log("手柄长度为:" + Vector3.Magnitude(direction));



            // 距离小于一半手柄长度时为跑状态
            if (Vector3.Magnitude(direction) < 0.7 ) {
                
                //让角色做走的动画 
                transform.GetComponent<Animator>().SetInteger("walkState", 1);

                walk(1, direction);
            }
                
            // 距离大于一半手柄长度时为跑状态
            if (Vector3.Magnitude(direction) >= 0.7 ) {
                transform.GetComponent<Animator>().SetInteger("walkState", 3);
                walk(3, direction);

                //奔跑的时候按下contrl键为冲刺
                if(Input.GetKey(KeyCode.LeftControl))
                {

                    transform.GetComponent<Animator>().SetInteger("walkState", 5);
                    walk(5, direction);
                }}



            if (Input.GetKeyDown(KeyCode.Space))
            {

                transform.GetComponent<Animator>().SetInteger("walkState", 2);
            }       

        }

        if (direction == Vector3.zero)
        {
            //让角色站立的动画
            //transform.GetComponent<Animation>().CrossFade("Idle01");  当游戏角色采用的是 animation 属性的时候使用

            transform.GetComponent<Animator>().SetInteger("walkState", 0);

            if (Input.GetKeyDown(KeyCode.Space))
            {

                transform.GetComponent<Animator>().SetInteger("walkState", 2);
            }
        }  }}

加上碰撞体,实现碰撞

clipboard.png
clipboard.png

AR项目

1,注册高通VR账号

https://developer.vuforia.com/

2,下载高通SDK,并导入到项目中


clipboard.png

3,配置license key


clipboard.png

clipboard.png

下载后直接安装到unity目录即可

如果不想注册账号可以上传图片到高通


clipboard.png

clipboard.png

clipboard.png

clipboard.png

图片上传完成,评级越高越好识别,如果评分过低建议换一张图片

将数据库下载下来,


clipboard.png

配置项目

1,删掉main camera
2,使用 ARcamera
gameobject=》vuforia engine =>AR camera

3,使用imagetarget,并配置
gameobject=》vuforia engine => camera image =》 Camera Image Target


clipboard.png

4,配置 vuforia configuration
window =》vuforia configuration


clipboard.png

5,放置要出现的AR物体
把要出现的物体作为imagetarget的子物体
6,启动项目扫描物体即可看到

总结

经过你这段时间对C#的学习了解,熟悉了C#的一些语法特性以及unity引擎的基本操作,基本了解到了游戏开发的大概,一半来说C#现在常用的桌面的开发是WPF框架,而C#最基础的winforms不怎么美观,而游戏开发基本上都是基于某一个游戏引擎,从而降低了动画操作编程的门槛。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。