untiy_untiy3d - CSDN
精华内容
参与话题
  • Unity快速入门系列课程(第1部)

    千人学习 2019-05-08 15:49:57
    针对有大量Unity初学者想在短期内(例如:2-4周时间)快速掌握Untiy的基本使用,了解基本开发技能。为满足入门学员的学习要求,“刘国柱讲Unity”系列课程,因此推出了本套“Unity快速入门系列课程”,目前内容包含...
  • untiy 2D角色控制器

    千次阅读 2016-07-04 23:40:19
    这里我用Prime31这个公司的插件改了一个比较小的控制脚本,博客结尾会给大家一份源码,先简单的讲一下2D人物控制器的原理,2D控制器可不像untiy 3D控制器那样,untiy官方帮我们封装了。所以这里就只能自己去写了,先...

             这节讲讲类似马里奥,盗贼遗产,这些类似的游戏人物基本的控制方式。这里我用Prime31这个公司的插件改了一个比较小的控制脚本,博客结尾会给大家一份源码,先简单的讲一下2D人物控制器的原理,2D控制器可不像untiy 3D控制器那样,untiy官方帮我们封装了。所以这里就只能自己去写了,先贴出一张图。

    图中的场景时源插件中的场景,我就直接拿来用免得自己去摆了,图中有3中不同的障碍物,方块代表玩家,1号障碍物是无法穿过的,2号可以穿过,3号是一个简单的坡,玩家可以从2好障碍物的下面直接跳上2,如果站在1号障碍物的下面是无法跳上1号障碍物。站在2号障碍物上可以按跳下键直接从2上面跳下,站在1号障碍物上无法从上面跳下。3号是一个长坡,如果坡的陡峭程度超过了玩家的最大爬坡角度的话玩家是不能爬上去的,有的坡可以像2号障碍物那样可以跳上和跳下。基本的介绍完了,接下来就是具体讲讲怎么实现了,这种控制器的核心就是射线检测。假如玩家受到重力的作用(这里的重力我们用一个常量来模拟,不用刚体自带的重力)开始往下落它遇到地面的时候会停止下落,那么首先我们要做的就是判断落地,我们在玩家盒子碰撞器的四周添加16个射线发射点,每个边有4个发射点,当我们速度y方向的值为正时表示我们在向上运动,反之在向下运动,为0就表示不动了,当y<0时,我们速度为velocity,velocity在y方向的分量为velocity.y,那么玩家下帧的偏移量我们定义为delta=velocity*Time.delatime;我们在玩家碰撞器的下边依次均匀分布在这条边上(考虑到碰撞器紧贴着其他碰撞器,所以我们的发射点在y轴上减去一点偏移量,我们把这个偏移量定义为skin,即皮肤),发射点问题解决了,接下来就是方向,距离,层的确定问题,如果速度的方向为下,方向就是-vector2.up,距离就是我们下帧的偏移量,层就是default层,1号障碍物的层为default,2号障碍物的层我们定义为OneWayPlatform,当velocity.y>0表示玩家正在向上运动,这是我们射线检测的点就是碰撞器向上的那个边了,四个发射点的位置在y轴上的分量同样依次减去skin偏移量,射线的方向为vector2.up,射线的距离为当前帧的偏移量,层我们忽略OneWayPlatform,当velocity.x>0时表示玩家往右移动,同时发射点取右边碰撞器的边,同样也需要同时减去skin,射线的方向为vector2.right,距离为当前帧的偏移量,层为default层。velocity.x<0以相反的情况推理就行了,代码如下:

    using UnityEngine;
    namespace Assets.LiuDoubi
    {
        [RequireComponent(typeof(BoxCollider2D), typeof(Rigidbody2D))]
        public class SampleCharacterCtr2D : MonoBehaviour
        {
            public struct CharacterColState2D
            {
                public bool Right;
                public bool Left;
                public bool Top;
                public bool Bottom;
    
    
                public bool IsColision
                {
                    get { return Right || Left || Top || Bottom; }
                }
                public void Reset()
                {
                    Right = Left = Top = Bottom = false;
                }
            }
    
            [SerializeField]
            private float _skin = 0.1f;//皮肤的厚度,一般定义0.001-0.1,建议在0.00级别。
            [SerializeField]
            private int _hraycount;//在x轴方向射线个数,我们定义为4个,同时y轴方向的射线个数也是4个
            [SerializeField]
            private int _vraycount;
            [SerializeField]
            private LayerMask _obstacleMask;//1号障碍物的层标识,default的层数字为1,所在的实际层为2<<层数
            [SerializeField]
            private LayerMask _onewayPlatforms;//2号障碍物的层标识
            [SerializeField]
            private float _slopeLimit;//玩家所能爬的最陡坡度
    
    
            public AnimationCurve slopeSpeedMultiplier = new AnimationCurve(new Keyframe(0f, 1f), new Keyframe(90f, 0f));
    
    
            private BoxCollider2D _boxCollider2D;
            private CharacterColState2D _colState2D;//碰撞信息,分别存储了4个方向的碰撞信息,分别为top,bottom,left,right
    
    
            private Vector3 _bottomright;//底边射点的右起始点,后面的点加上一点的偏移量即可求得,下面依次类推
            private Vector3 _bottomleft;
            private Vector3 _topright;
            private Vector3 _topleft;
    
    
            private LayerMask _curMask;//最后玩家实际需要检测的层
            public Vector3 Velocity;//玩家的速度
    
    
            public bool IgnoreOneWayPlatforms;//表示是否忽略OneWayPlatforms
    
    
            private bool _lastFramIsGround;
    
    
            public bool IsGround { get { return _colState2D.Bottom; } }
            private void Awake()
            {
                _boxCollider2D = this.transform.GetComponent<BoxCollider2D>();//先缓存一下玩家的盒子碰撞器
                GetRayOffset();
            }
            public void Move(Vector3 delta)//该方法为该组件对外的方法。同时也是主要方法。如果当前帧没碰到碰撞器,那下帧情况我们不是很清楚,所以我们的做法就是每帧都去检测,同样每帧的碰撞信息都应该清除
            {
                _curMask = _obstacleMask;
    
                _lastFramIsGround = IsGround;//判断上一帧玩家是不是在地上,因为没帧都在检测,所以我们需要保存上一帧的玩家碰撞信息。
                _colState2D.Reset();//碰撞信息重新清除
    
                RecalculateRayOrigin();//重新计算射线其实点,每帧玩家的位置信息都在发生变化,所以每帧都需重新计算。
                if (Mathf.Abs(delta.x) > 0.001f)//如果在x方向偏移不为0,对其进行计算,如果y轴上的偏移不为0同样也需对其进行计算。这2个方法的作用就是返回一个偏移通过delta传出去,ref 和 out表示值类型的参数按引用传递,本质都是传的地址。区别我就不说了。
                    MoveHorizontal(ref delta);
    
    
                if (Mathf.Abs(delta.y) > 0.001f)
                    MoveVertical(ref delta);
    
                delta.z = 0;
                this.transform.Translate(delta, Space.World);
                if (Time.deltaTime > 0f)
                    Velocity = delta / Time.deltaTime;
                IgnoreOneWayPlatforms = false;
            }
            private void MoveHorizontal(ref Vector3 delta)
            {
                bool isrgiht = delta.x > 0;//判断是不是向右
                Vector2 raydir = isrgiht ? Vector2.right : -Vector2.right;//如果向右的话,那么射线的方向就是向右的。
                Vector2 rayorigin = isrgiht ? _bottomright : _bottomleft;//如果向右的话,起始点我们从右下边,反之就是左下边取。
                float rayDistance = Mathf.Abs(delta.x) + _skin;射线的方向是偏移量在x轴上的分量加上皮肤的厚度。
                for (int i = 0; i < _hraycount; i++)
                {
                    var originpos = new Vector2(rayorigin.x, rayorigin.y + i * _vrayoffset);//依次求出射点的位置。
                    RaycastHit2D hit;
                    hit = Physics2D.Raycast(originpos, raydir, rayDistance, _obstacleMask);
                    if (hit)
                    {
                        if (i == 0 && HandleHorizontalSlope(ref delta, Vector2.Angle(hit.normal, Vector2.up)))//如果玩家是在爬坡的话,并且只有0号射点才能检测到障碍物的话,那么我们不用计算下面的了。
                        {
                            break;
                        }
                        delta.x = hit.point.x - originpos.x;
                        if (isrgiht)//如果检测到了障碍物的话,并且是在右边话,表示玩家的朝向有一个障碍物
                        {
                            delta.x -= _skin;
                            _colState2D.Right = true;
                        }
                        else
                        {
                            delta.x += _skin;
                            _colState2D.Left = true;
                        }
                        break;
                    }
                }
            }//该方法的作用是,假如我们离障碍物有0.1,如果我们下一帧移动偏移量为0.2的话,如果我们还是按照0.2进行移动话,那么玩家就和障碍物重叠了,如果这时我们发现重叠了,然后又把玩家移动-0.1的偏移的话,在短暂的时间内,一般玩家是可以看出来的,所以我们的做法应该在这一帧只移动0.1.。同时下面的方法都是一样的,只有上坡的时候检测可能有点区别。
            private void MoveVertical(ref Vector3 delta)
            {
                bool isdown = delta.y < 0;
                Vector2 raydir = isdown ? -Vector2.up : Vector2.up;
                Vector2 rayorigin = isdown ? _bottomleft : _topleft;
                float rayDistance = Mathf.Abs(delta.y) + _skin;
                if (isdown && !_lastFramIsGround)
                    _curMask |= _onewayPlatforms;
                if (_lastFramIsGround && IgnoreOneWayPlatforms)
                    _curMask &= ~_onewayPlatforms;
                for (int i = 0; i < _vraycount; i++)
                {
                    var originpos = new Vector2(rayorigin.x + i * _hrayoffset, rayorigin.y);
                    RaycastHit2D hit;
                    hit = Physics2D.Raycast(originpos, raydir, rayDistance, _curMask);
                    if (hit)
                    {
                        delta.y = hit.point.y - originpos.y;
                        if (isdown)
                        {
                            delta.y += _skin;
                            _colState2D.Bottom = true;
                        }
                        else
                        {
                            delta.y -= _skin;
                            _colState2D.Top = true;
                        }
                        break;
                    }
                }
            }
            private bool HandleHorizontalSlope(ref Vector3 delta, float angle)
            {
                if (Mathf.RoundToInt(angle) == 90)
                    return false;
                if (angle < _slopeLimit)
                {
                    if (delta.y < 0.05f)
                    {
                        var slopeModifier = slopeSpeedMultiplier.Evaluate(angle);
                        delta.x *= slopeModifier;
                        delta.y = Mathf.Abs(Mathf.Tan(angle * Mathf.Deg2Rad) * delta.x);
                        var isGoingRight = delta.x > 0;
                        var ray = isGoingRight ? _bottomright : _bottomleft;
                        RaycastHit2D raycastHit;
                        //if (_lastFramIsGround)
                        raycastHit = Physics2D.Raycast(ray, delta.normalized, delta.magnitude, _curMask);
                        if (raycastHit)
                        {
                            delta = (Vector3)raycastHit.point - ray;
                            if (isGoingRight)
                                delta.x -= _skin;
                            else
                                delta.x += _skin;
                        }
                        //_isGoingUpSlope = true;
                        _colState2D.Bottom = true;
                    }
                }
                return true;
            }
            private void RecalculateRayOrigin()//重新计算射线的各个位置的起始位置
            {
                float xoffset = _boxCollider2D.size.x * this.transform.localScale.x / 2;
                float yoofset = _boxCollider2D.size.y * this.transform.localScale.y / 2;
                _topleft = transform.position + new Vector3(-xoffset + _skin, yoofset - _skin, 0);
                _bottomleft = transform.position + new Vector3(-xoffset + _skin, -yoofset + _skin, 0);
                _topright = transform.position + new Vector3(xoffset + -_skin, yoofset - _skin, 0);
                _bottomright = transform.position + new Vector3(xoffset + -_skin, -yoofset + _skin, 0);
            }
            private float _hrayoffset;
            private float _vrayoffset;
            private void GetRayOffset()//计算每边射点与射点之间的距离。
            {
                var xdis = _boxCollider2D.size.x * this.transform.localScale.x - 2 * _skin;
                var ydis = _boxCollider2D.size.y * this.transform.localScale.y - 2 * _skin;
                _hrayoffset = xdis / _hraycount;
                _vrayoffset = ydis / _vraycount;
            }
        }
    }

    这样讲的好麻烦了,总之一句话,move方法中 MoveHorizontal(ref delta); MoveVertical(ref delta);就是计算玩家下一帧需要移动的偏移量。这里给出了2套控制代码,一套是Prime31,另外一套是自己写,但是大家可以先学习prime31这个插件。然后去写自己角色控制器,我写这些只是帮助大家理解角色控制器。http://pan.baidu.com/s/1hrGNgiS
    如果有什么不懂的可以私聊,qq:1850761495

    展开全文
  • Unity快速入门系列课程(第2部)

    千人学习 2019-05-08 17:50:06
    针对有大量Unity初学者,只想在短期内(例如:2-4周时间)快速掌握Untiy的基本使用,了解基本开发技能。为了满足想要快速入门学员的学习要求,“刘国柱讲Unity”系列课程,因此推出了本套“Unity快速入门系列课程”...
  • 1、到untiy3d官网上下载untiy3d的软件(这里我使用的是个人版的5.3.61f做学习使用) 2、安装vs2012 3、因为unity3d和vs的版本有一定的版本对应关系,我这里使用vs2012 4、到网上下载vs2012 tools for untiy3d的...

    1、到untiy3d官网上下载untiy3d的软件(这里我使用的是个人版的5.3.61f做学习使用)

    2、安装vs2012

    3、因为unity3d和vs的版本有一定的版本对应关系,我这里使用vs2012

    4、到网上下载vs2012 tools for untiy3d的工具,注意进入官网下载时,一定要选择自己vs对应的版本

    5、接下来就可以进行开发了

    6、打开untiy3d软件,设置脚本编辑器为vs2012.在unity3d的菜单“edit”下拉中找到“preferences"里面的”Exteranl tools"(个人偏好设置)设置为vs2012

    7、在Hirearch中点击create创建一个新的C# sprite,双击,脚本直接以vs2012打开

    转载于:https://www.cnblogs.com/sguozeng/p/8404096.html

    展开全文
  •   不过也非常荣幸的告诉大家,笔者已与人民邮电出版社签定了出版合同,预计ARCore书籍《ARCore之路-Untiy开发从入门到实践》2019年3月底会完成创作,2019年6月份出版。   这也是按照合同约定,书稿除了人民邮电...

    --------------------- 2019年8月21日更新-----------------------------------
      出版社反映说今年书籍出版要求比往年严格,因此纸质图书出版可能还得需要点时间。目前电子版已经上线,地址:https://www.epubit.com/bookDetails?id=UB6c786ad7aa014 ,感谢大家的耐心等待!讨论扣扣群:[1-9-0-3-0-4-9-1-5][one nine zero three zero four nine one five]

    --------------------- 2019年6月13日更新-----------------------------------
      放出《ARCore之路-Untiy开发从入门到实践》前4章试读,有什么问题请提出宝贵意见,但提了也没用,这版是改不了了,呵呵。下载地址

    --------------------- 2019年4月1日更新-----------------------------------
      历经11个月的写作,《ARCore之路-Untiy开发从入门到实践》已全部完成,感谢大家的关注。
      AR技术是下个十年最重要的技术之一,Digi-Capital发布的报告显示,AR用户基数在5年内可达到35亿。AR技术发展已到达临界期,AR+AI技术的需求将持续增加,潜在的市场需求在AR从实验室走向实际应用时会出现井喷。预计在2020年,AR应用将开始大规模普及,科技从业人员对AR技术资料的需求巨大,本书的出现填补了AR发展前期技术资料缺乏的空白,
      ARCore是谷歌推出的搭建增强现实应用程序的软件平台,软件开发者可以利用其开发增强现实应用,增加增强现实功能,而Unity目前已成为AR开发事实上的行业标准。相比于当前市面上为数不多的其他书籍和资料,本书具有以下特点:
      结构连贯 本书共分三个部分,第一部分为基础篇(包含第1章至第9章),对ARCore各个技术点进行全面深入的剖析;第二部分为提高篇(第10章至第11章),主要从高层次对AR开发中的原则及性能优化进行讲解;第三部分为实践篇(第12章),通过基础篇中的技术进行综合运用,提升运用技术点的能力。从技术深度到技术运用,最佳化技术转化成实际能力的学习曲线。
      循序渐进 本书充分考虑不同知识背景读者的需求,按知识点循序渐进,通过大量配图、实例进行详细讲解,即使是毫无Unity使用经验的读者也能轻松上手。
      深浅兼顾 在讲解ARCore技术点的同时对其原理、背景进行了较深入的探究,不仅仅拘泥于基础,使读者知其然更能知其所以然。同时为防止陷入数学的泥淖,使用通俗易懂的语言解释深奥枯燥的数学原理,非常便于数学基础不扎实的读者理解。
      实用性强 本书实例丰富,每一章都有一到两个实例,还有充分利用各技术点的综合实例章节,很多实例中的技术都可以应用到实际的项目中,实用性非常强。
      现附本书目录[pdf版目录下载需要5个积分还修改不了,CSDN的锅,请点这里],图书预计6月份出版,如有宝贵意见,还请留言以便完善,非常感谢!!
      为方便大家交流沟通,新建一扣扣群:oneninezerothreezerofournineonefive,欢迎加入交流。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    --------------------- 2019年3月20日更新-----------------------------------
      经过紧张的撰写、重写、校稿,《ARCore之路-Untiy开发从入门到实践》最终定稿12章,涵盖了ARCore所有的功能模块(包括v1.7的Augmented Faces功能)。目前书籍编写工作已进入尾声,380页18万字(最终排版后页数可能会有所变化,字数只计算中文汉字)。感谢大家的关注!
      为方便大家交流沟通,新建一扣扣群:oneninezerothreezerofournineonefive,欢迎加入交流。

    --------------------- 2019年3月7日更新-----------------------------------
      食言了,食言了,非常非常抱歉未能及时放出《ARCore之路-Untiy开发从入门到实践》书籍目录,主要原因有两个:一个是2月14号ARCore放出了新的版本v1.7,这个版本加入了Front-facing Camera & Augmented Faces功能,这个模块能实现的效果是目前最热门的变脸效果,书籍需要纳入这块内容;第二个原因是重写与校稿比我预想的要慢一些。
      为保证书籍按时出版,下步需要更加努力了。谢谢关注!!

    --------------------- 2019年2月13日更新-----------------------------------
      目前,书籍《ARCore之路-Untiy开发从入门到实践》已完成9章的内容创作,计划11章,如果后续内容不能完全概括的话也可能是12章。
      按照人民邮电出版社发来的格式及合同要求,正在对原内容进行比较大幅度的修改,对部分章节进行了完全重写,对部分内容进行了充实完善,改善了语言的连贯一致性和叙述的准确性,这是个耗时的工作,也是个细仔的工作,但也是书籍质量的保证。
      由于从去年初的ARCore v1.0到目前的v1.6,ARCore SDK也进行了比较大的调整,部分原来的方法被修改,流程和操作方式也有调整,为了反映这些最新的变化,书籍中对这些变化也进行了处理。
      预计本月底放出书籍目录结构。

    --------------------- 2019年1月17日更新-----------------------------------
      各位读者与粉丝,非常抱歉,原创作的ARCore系列删除了很多文章。
      不过也非常荣幸的告诉大家,笔者已与人民邮电出版社签定了出版合同,预计ARCore书籍《ARCore之路-Untiy开发从入门到实践》2019年3月底会完成创作,2019年6月份出版。
      这也是按照合同约定,书稿除了人民邮电出版社之外不得再投其他媒体单位,故删除了很多篇文章,还请大家见谅,同时也感谢大家对笔者博客的关注,并请大家继续支持,因为有了你们的支持我才有动力继续写下去。
      关于《ARCore之路-Untiy开发从入门到实践》的后续动态,我会及时的在这里更新。
      再次感谢大家的支持!

    展开全文
  • 脚本 2019版本的 脚本就一句非常的简单,命名空间一定要加 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;//先添加命名空间 ...

    脚本

    2019版本的
    脚本就一句非常的简单,命名空间一定要加

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;//先添加命名空间
    
    public class QH : MonoBehaviour
    {
        void Update()
        {
            //按下A键切换场景
            if (Input.GetKeyDown(KeyCode.A))
            {
                //括号里是场景的名字,千万不要写错!!!
                SceneManager.LoadScene("Scene_2");
            } 
        }
    }
    
    

    Unity场景的设置

    先建两个场景
    场景一

    场景1
    ·场景二

    在这里插入图片描述

    挂在脚本给任意游戏对象,然后点击file,build settings
    在这里插入图片描述
    把两个场景拖进去,关闭build setting,运行unity,按A键就可以啦
    在这里插入图片描述非常简单,你学到了吗?还有不懂的可以问我哦

    展开全文
  • untiy_Android接入sdk

    2018-04-23 17:12:10
    参考文档: https://blog.csdn.net/yang8456211/article/details/51356193 主要原理   1)unity里面调用android项目: test.cs脚本 AndroidJavaClass jc; AndroidJavaObject jo;...jc = new AndroidJav...
  • Untiy3d 脚本打包

    2017-10-18 15:15:16
    static string APP_NAME = "AppName"; [MenuItem("Publish/cAndroid")] public static void BuildAndroid() { BuildVer(PlatformType.Android); } [MenuItem("Publish/Build IOS")]
  • untiy中使用flash插件。

    2018-11-09 12:56:36
    untiy中使用flash插件。
  • 目前使用的是unity5.4的版本和SQLserver2008. 首先为了测试在数据库里新建了一个名为11的数据库,里面建了一个表,名为student 随便填入一些内容,如下: ...首先去unity的安装的目录里,如下路径里,例如:E:\...
  • 1、 创建2D UI,2、 创建标题,3、 创建开始游戏、选项和结束游戏按钮4、 为按钮添加声音5、 添加游戏介绍并让文字一点一点显示出来6、 设计选项按钮7、 使用脚本监听控件值得修改,取得控件的值8、 完成界面的动画...
  • 1.请描述游戏动画有哪几种,以及其原理。 答:主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。  关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色...
  • Untiy 只读属性实现

    千次阅读 2016-12-26 19:16:36
    想在Untiy 中,在检视板上看到,但是有不希望别人在检视板上改动。 这时候就会有人说,怎么不使用检视板的debug模式呢? 我不想动手点击,就希望看到,灰色起来方便看属性值的变化。 下面的代码就十分有用...
  • untiy Application API

    2017-08-22 21:02:08
    datapath:数据文件路径; persistentDataPath:返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件,同一平台,不同程序中调用此属性,返回值相同; streamingAssetsPath:返回流数据的缓存...
  • untiy 初识之富文本

    2018-03-06 15:41:41
    eg: ... RichText 在ui系统和旧的ui上,都有支持。 在现在的 UI System 中可以通过标签来设置文本的一些属性, ToHtmlStringRgb可以通过Color 获取颜色的16进制对应的文本 ...
  • 第一种方式: 1.百度的第三方法 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...public class TouchType : MonoBehaviour ... // Start is called before the ...
  • untiy-FairyGUI

    2018-06-01 16:51:30
    有没有用FGUI做游戏的公司啊,想换个公司
  • 《ARCore之路-Untiy开发从入门到实践》目录,书籍预计于2019年6月出版。
  • Untiy 学习笔记

    2012-05-21 17:13:48
    http://angelsthanatos.blogcn.com/articles/unity%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B01.html
  • Untiy中的Awake和Start的区别和使用 最近又碰到了这个问题,特此来做一下回忆和记录。切记网上搜索的东西,一定要自己去尝试验证,很多文章内容都是胡乱转载,根本没有加以认真的核对就发布。以下我都进行了测试和...
1 2 3 4 5 ... 20
收藏数 11,487
精华内容 4,594
关键字:

untiy