初识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不怎么美观,而游戏开发基本上都是基于某一个游戏引擎,从而降低了动画操作编程的门槛。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352