• 近日在开发项目中,遇到一个这样的需求:将炮弹旋转至开火方到受击方所成的角度上,简言之就是将一枚炮弹旋转到开或者到敌人的方向上。 如何旋转2D贴图? 查阅了很多资料,都是关于四元数,欧拉角的问题。有点...

    引言

    近日在开发项目中,遇到一个这样的需求:将炮弹旋转至开火方到受击方所成的角度上,简言之就是将一枚炮弹旋转到开或者到敌人的方向上。

    如何旋转2D贴图?

    查阅了很多资料,都是关于四元数,欧拉角的问题。有点杀鸡焉用牛刀的意味,于是自己摸索着利用已有的接口用一种简单的方法实现。(注意,我的需求存在于2D场景内)

    用到的接口

    Vector3.Angle

    public static float Angle(Vector3 fromVector3 to);

    Parameters

    fromThe angle extends round from this vector.
    toThe angle extends round to this vector.

    Description

    Returns the angle in degrees between from and to.

    The angle returned is always the non reflex angle between the two vectors - ie the smaller of the two possible angles between them and never greater than 180 degrees.

    using UnityEngine;
    
    public class AngleExample : MonoBehaviour
    {
    	public Transform     target;
    
    	// prints "close" if the z-axis of this transform looks
    	// almost towards the target
    
    	void Update ()
    	{
    		Vector3 targetDir = target.position - transform.position;
    		float angle = Vector3.Angle( targetDir, transform.forward );
    
    		if( angle < 5.0f )
    			print( "close" );
    	}
    }

    Vector3.Angle()代表的实际含义其实是,原点到from点与原点到to点的夹角,即OA与OB的夹角。俗话说不会美术的策划不是好程序:


    然而当我们需要AB与水平坐标的夹角该怎么办呢?这时候就需要引入传说中的单位向量了。

    解决方案

    using UnityEngine;
    using System.Collections;
    
    public class ArrowTest : MonoBehaviour {
    
        public UISprite arrow;
    	// Use this for initialization
    	void Start () {
            TestForRotation(); 
    	
    	}
    	
    	// Update is called once per frame
    	void Update () {
    	
    	}
    
        void TestForRotation()
        {
            GameObject pointA = GameObject.Find("PointA");
            GameObject pointB = GameObject.Find("PointB");
            Vector3 vecA = pointA.GetComponent<Transform>().localPosition;
            Vector3 vecB = pointB.GetComponent<Transform>().localPosition;
            Vector3 direction = vecB - vecA;                                    ///< 终点减去起点
            float angle = Vector3.Angle(direction, Vector3.right);              ///< 计算旋转角度
            arrow.GetComponent<Transform>().Rotate(0, 0, angle);
        }
    }
    运行结果:

    箭头指向AB方向,垂直结果:



    任意“角度”运行结果:



    为什么“角度”要加引号?我们来看如果需要旋转到BA所成的夹角会出现什么情况:


    显然,箭头的指向于BA所成的角度并不一致。

    这是由于Vector3.Angle()的定义中有这样一句话:The angle returned is always the non reflex angle between the two vectors - ie the smaller of the two possible angles between them and never greater than 180 degrees.

    返回的角度总是两个角度中较小的一个,且不会超过180°,因此当所需旋转的角度大于90°时,需要进行适当的变换。如何界定是否超过90°呢?这时候Vector3.Dot,向量点乘就派上用场了,当旋转角度与Vector3.up相反时,需要对角度进行适当的变换。

    修正后的代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class ArrowTest : MonoBehaviour {
    
        public UISprite arrow;
    	// Use this for initialization
    	void Start () {
            TestForRotation(); 
    	
    	}
    	
    	// Update is called once per frame
    	void Update () {
    	
    	}
    
        void TestForRotation()
        {
            GameObject pointA = GameObject.Find("PointA");
            GameObject pointB = GameObject.Find("PointB");
            Vector3 vecA = pointA.GetComponent<Transform>().localPosition;
            Vector3 vecB = pointB.GetComponent<Transform>().localPosition;
            //Vector3 direction = vecB - vecA;                                    ///< 终点减去起点(AB方向与X轴的夹角)
            Vector3 direction = vecA - vecB;                                  ///< (BA方向与X轴的夹角)
            float angle = Vector3.Angle(direction, Vector3.right);              ///< 计算旋转角度
            direction = Vector3.Normalize(direction);                           ///< 向量规范化
            float dot = Vector3.Dot(direction, Vector3.up);                  ///< 判断是否Vector3.right在同一方向
            if (dot < 0)
                angle = 360 - angle;
            Debug.LogWarning("vecA:" + vecA.ToString() + ", vecB:" + vecB.ToString() + ", angle: " + angle.ToString());
            arrow.GetComponent<Transform>().Rotate(0, 0, angle);
        }
    }
    
    箭头转向BA向量的结果如图:


    7.11补充:

    1)更新一种计算角度的方法,通过Atan()接口

    2)通过欧拉角来旋转对象

    3) 通过四元数的插值函数来平滑过渡旋转过程

    using UnityEngine;
    using System.Collections;
    
    public class ArrowTest : MonoBehaviour
    {
    
        public UISprite arrow;
    
        private Vector3 targetVec;
        private float targetAngle, AtanTarget;
        // Use this for initialization
        void Start()
        {
            TestForRotation();
    
        }
    
        // Update is called once per frame
        void Update()
        {
            ///< 补充点3: 通过插值使箭头平滑的转向指定的方向,在游戏中常用于人物转头,转移视角等操作,当然是在3D空间中,这里就抛块砖了。0.1f只是我偷懒写的一个单位值,正式的项目中一般会deltaTime * speed来控制转向的速度。
            arrow.GetComponent<Transform>().rotation = Quaternion.Slerp(arrow.GetComponent<Transform>().rotation, Quaternion.Euler(0, 0, AtanTarget), 0.1f);
        }
    
        void TestForRotation()
        {
            GameObject pointA = GameObject.Find("PointA");
            GameObject pointB = GameObject.Find("PointB");
            Vector3 vecA = pointA.GetComponent<Transform>().localPosition;
            Vector3 vecB = pointB.GetComponent<Transform>().localPosition;
            //Vector3 direction = vecB - vecA;                                    ///< 终点减去起点(AB方向与X轴的夹角)
            Vector3 direction = vecA - vecB;                                  ///< (BA方向与X轴的夹角)
            float angle = Vector3.Angle(direction, Vector3.right);              ///< 计算旋转角度
            direction = Vector3.Normalize(direction);                           ///< 向量规范化
            float dot = Vector3.Dot(direction, Vector3.up);                  ///< 判断是否Vector3.right在同一方向
            if (dot < 0)
                angle = 360 - angle;
            
            targetAngle = angle;
            targetVec = new Vector3(0, 0, angle);
    
            ///< 补充点1: 通过Atan2与方向向量的两条边可以计算出转向的角度,通过计算结果可以看到targetAngle与-AtanTarget相加正好是360°,即二者都指向同一方向。具体使用场景需要根据具体需求分析。
            AtanTarget = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
            Debug.LogWarning("vecA:" + vecA.ToString() + ", vecB:" + vecB.ToString() + ", targetAngle: " + targetAngle.ToString() + ", AtanTarget: " + AtanTarget.ToString());
            //arrow.GetComponent<Transform>().Rotate(0, 0, angle);
    
            ///< 补充点2: 使用欧拉角来控制物体的旋转
            //arrow.GetComponent<Transform>().eulerAngles = new Vector3(0, 0, angle);
        }
    }
    


    展开全文
  • 本文主要讨论,在Unity中使用物理引擎Physics2D的三个方面的内容: 如何让Rigidbody2D物理模拟看起来更加的顺滑。 介绍几个造成运动卡顿的原因和解决方法。 针对Rigidbody2D的重心旋转模拟。 让运动更加顺滑最直接的...

    本文主要讨论,在Unity中使用物理引擎Physics2D的三个方面的内容:

    • 如何让Rigidbody2D物理模拟看起来更加的顺滑。
    • 介绍几个造成运动卡顿的原因和解决方法。
    • 针对Rigidbody2D的重心旋转模拟。

    让运动更加顺滑

    最直接的方法,就是设置Rigidbody2D的Interpolate属性,面板属性提供了下拉选项,有None,Interpolate,Extrapolate。官方文档介绍的很清晰,这是物理模拟在Update过程中的运动插值计算,用来解决运动生涩(卡顿)的问题。

    • None 不进行平滑插值。
    • Interpolate 运动插值基于前几帧的位置。在一个相对平稳的运动环境里是有很好效果的。但如果是颠簸,崎岖的运动环境,前几帧的插值并不能很好的反应未来的趋势。
    • Extrapolate 运动插值基于后几帧的预测位置。根据物理公式和地形预测,可以很好的估算出未来几帧的情况,但遇到突然的碰撞或外力影响,就无法得到很好的效果。

    经过测试发现,如果Rigidbody2D的所有的父节点是固定不动的(没有手动控制),Interpolate 和 Extrapolate 一样顺滑,并且要比None来的流畅。如果Rigidbody2D的父节点有运动(手动控制),Interpolate会有明显的卡顿,Extrapolate 和 None 差不多,但是依然是不流畅的。

    卡顿问题

    抛开性能问题,我遇到的卡顿来自于两个原因。第一,就是上面所说的Rigidbody2D的父节点发生了运动,造成了物理运动有明显的生涩感。第二,就是手动设置了Rigidbody2D的transform属性,如Position,Rotation,Scale等。

    其实,这两个问题是同一个原因,就是不要手动设置和Rigidbody2D相关的transform属性,包括父类链的所有节点。物理引擎会接管一切运动模拟,引擎会有自己的算法预测,手动设置会造成冲突。

    经过测试发现,哪怕使用了Rigidbody2D的Constraints约束,Freeze Position 或 Freeze Rotation 之后,依然不能去手动设置锁住的属性,否则依旧会造成卡顿。

    那如果遇到了必须要手动设置的需求,应该怎么办呢 ? 这时候可以使用Rigidbody2D暴露的接口去控制。

    Rigidbody2D.position
    Rigidbody2D.rotation
    Rigidbody2D.MovePosition
    Rigidbody2D.MoveRotation

    Rigidbody2D 暴露了两个属性和两个方法,用来设置position和rotation。经过测试发现,设置属性依然卡顿,但使用Move方法就消除了卡顿的现象。所以,手动改变Rigidbody2D的position和rotation使用其暴露的Move方法是最好的办法。

    重心旋转

    在使用Rigidbody2D的过程中,期望能够实现,因为重心在运动中产生自发旋转的效果,比如弓箭的飞行模拟。

    开始使用了centerOfMass,强行把刚体的质心移动到物体边缘或外部,期望质心能够在重力作用下,形成旋转力,结果不尽人意,自由落体的时候作用很小,反而碰撞接触了产生了很大的效用。

    后来,使用了Rigidbody2D的angularVelocity角速度设置,并且Freeze Rotation锁住了刚体本身的旋转模拟,让angularVelocity无干扰的发挥作用。其结果是可以工作,但是效果不够真实,angularVelocity并没有衰减而且是一个固定的速率,难道还需要每帧去模拟angularVelocity的变化,太过繁琐。

    最终,使用了每帧去计算rotation的数值,并Freeze Rotation锁住旋转,得到了很好的效果。大概实现如下:

    private void FixedUpdate()
    {
        if (this.body2D.bodyType == RigidbodyType2D.Dynamic)
        {
            var deltaTime = Time.fixedDeltaTime * 0.5f * this.transform.localScale.x > 0 ? 1.0f : -1.0f;
            var v2        = this.body2D.velocity;
            // s = (v0 + v1) * t / 2
            this.body2D.MoveRotation(Mathf.Atan2(v2.y * deltaTime, v2.x * deltaTime) * Mathf.Rad2Deg);
        }
    }

    根据当前刚体的速度,计算一帧的xy方向的运动距离,通过Atan2来计算出旋转角度,在FixedUpdate中手动设置给刚体,当然要使用MoveRotation来得到流畅的旋转效果。


    「Extrapolate」

    展开全文
  • 1.2D Physics游戏对象和3D Physics游戏对象可共存在一个场景,但是它们不能相互反应(interact with each other)。 2.2D Physics只在x和y轴上有反应,z轴怎样改变都是0.   3. 要设置Physic2D的各项参数见下:...

    1.2D Physics Overview

    1.2D Physics游戏对象和3D Physics游戏对象可共存在一个场景,但是它们不能相互反应(interact with each other)。

    2.2D Physics只在x和y轴上有反应,z轴怎样改变都是0.

     

    3. 要设置Physic2D的各项参数见下:

     

     

    需要注意的是Rigidbody2D的gravity是gravity scale,默认值在上面的图里设好,然后在rigidbody2D的设比例,比如1就是100%,0.1就是10%。

     

    4.2D Physics有6种Collider,分别是Circle,Box,Edge,Polygon,Capsule,Composite。

    前四种的作用如下:

     

    2.Rigidbody 2D

    1.只有加了rigidbody2d组件的sprite可以动,只有再添加collider2d的才可以与场景互动。

    2.Mass为质量。质量小的推质量大的就比较难推(两个都有collider)。

    3.Linear Drug就像空气阻力,移动时会慢慢停止。

    4.Angular是角阻力,原地旋转会慢慢停止。

    5.Gravity Scale已在上面解释,是重力比率。

    6.Fixed Angle是该对象可移动,但不可旋转。(掉在一个斜面上就直直滚下去了,本身不会旋转)

    7.Is Kinematic勾选时,该对象不受力的影响(包括重力等),可用脚本控制position和rotation的移动。比如有一个platform,我们勾选了kinematic,在脚本里控制移动它的transform,但因为该platform还是需要和其它对象互动,比如小球,那它就要有2d collider。

    8.Interpolate移动平滑内插值,一般用于对象运动慢慢生涩/抖动(jerky),比如刹车?选择interpolate移动的顺滑程度取决于上一帧;选择extrapolate顺滑程度取决于下一帧(就像Adventure Game里Player的移动一样)。

    9.Sleeping Mode睡眠状态,Start Asleep初始是睡眠的,会被其他碰撞(collisions)唤醒。Start Awake 初始是醒着的。Never Sleep尽量别选这个,对性能有影响。

    10.Collision Detection碰撞检测,一般都选Continuous。

    Discrete:将碰撞检测设置为离散时,如果物体移动速度足够快,则在物理更新期间,具有刚体2D和碰撞2D的GameObjects可以相互重叠或通过。 碰撞接触只在新的位置产生。

    Continuous:当碰撞检测设置为连续时,具有刚体2D和碰撞2D的GameObjects在更新期间不会彼此通过。 相反,Unity计算任何Collider 2D的第一个影响点,并在那里移动GameObject。 请注意,这比离散占用更多的CPU时间。(如果没那么快的话可以选Discrete?)

     

    3.Collider 2D

    1.Edge Collider和Polygon Collider有点像,都是多边形检测。但Polygon的是封闭的,Edge用于表面是开口的。

     

    2.是否勾选Is Trigger的区别:来源http://www.cnblogs.com/infly123/p/3920393.html

    trigger被勾选时就是一个检测器,可以被穿过但会记下状态(比如Zoombunny的外圈spheir collider就是勾选了is trigger用来检测敌人进入攻击范围。内圈的capsule collider不勾选不让其他物体穿过)。

     

    3.Material。用来调整发生碰撞时2D物体对象之间的碰撞和反弹。2D的Material和3D的很不一样,2D的拼写为Physics Material(有s)。Material都是内搭在系统里的,可以在Assets→Creat→Physics Material 2D选择。制作一个木球和一个冰平面所需要的材质就不一样,可以选择了之后拖入到Material框里。

     

    4.给sprite添加collider后会根据sprite的边缘自动调整大小形状,如果不满意,可以拖动collider边缘线上的小绿点进行调整。(就像Survival Shooter里调整collider一样)

     

    5.Edge和Polygon Collider可以摁住ctrl键点绿点(该段边缘线会变成红色)来取消修改边缘。

     

    6.一个对象可以只有collider没有rigidbody(比如地形上的东西)。但要两者react必须最少一个有rigidbody。

     

    4.Hinge Joint2D

    好复杂,暂时用不到,先不学了。用在像弹簧,弹簧门开合,用绳子垂下来的东西的移动等。

     

    5.Area Effector2D

    组件Area Effector2D必须添加在同时有Collider2D的对象上。比如梦露经典的白裙子被吹起,那个吹气的地网区域在游戏里就可以用Area Effector2D来作为一个对其他对象施加力的区域。

    比如下面这个金币被吹起的游戏,金币的组件为

     

    吹风机的组件为

    注意要使用Area Effector它的Collider组件必须勾选Used By Effector,如上图。同时Collider必须勾选is trigger让其他对象进入该区域以受力。同时受力对象也必须有Collider组件,如上图的金币。

     

    组件设置:

    Collider Mask:对哪个Mask产生作用。

    Force Direction力的方向,比如上面是向右和向上(范围从0~359.99),逆时针方向,0为右,90为向上,and so on。注意这个方向是World Space的,即把挂这个组件的对象旋转成什么样,它的施力方向也是在这里设置好的。(教程里是这样说的,现在Unity好像已经改了,可以设置Local或World了)

    Force Magnitude:施加的力量的大小。

    Force Variation:施力的范围变化。会在For Magnitude的数值上随机一个力施加。比如Magnitude设置为100,Variation设置为20,则在100到120内随机添加一个力。如果Variation为负,比如-20,则是80到100内随机添加一个力。

    Drag & Angular Drag:施加的阻力和角阻力的方向。(比如上面图的向上吹的区域,如果Augular Drag设为10,金币被吹起离开这个区域后会全部向右下落。如果为10则随机方向下落)。

    Force Target:如果选rigidbody则是作用于整个物体,物体受力时不旋转。如果选collider则会一边移动一边旋转(见视频效果)。

     

    6.Distance Joint2D

    让组件所在的对象围绕着另一个对象(或一个点)做运动。比如一个点(在组件里设置位置)加一个球(拥有Distance Joint2D组件),则这个球就像钟摆一样绕着这个点运动。即使没有铰链和挂点的情况下。

     

    7.Point Effector2D

    点效应器施加在一个点上施加力影响一个范围。比如一个点爆炸把范围内的一堆金币炸开,比如一个黑洞把一定范围内的星体全部吸入等。和Area Effector的设置几乎一样,比如被反应对象也要有collider,自身collider要勾选两个选项等。

    不同的是,一般Point Effector2D所在的对象都会挂上脚本,用SetActive true or false来控制Point Effector2D,比如摁下空格,就true,然后炸一次。

    至于是炸开还是吸入则是For Magnitude的值是正还是负。(教程里的改变设置来实现各种效果很有趣,值得一看)/

     

    8.Sliding & Bouncing in 2D

    主要是讲Physics Material 2D比如bouncing(橡皮球的弹跳效果),sliding(冰面的滑动效果)。

    Project下Creat选Physics Material 2D,然后在Assets文件夹里会新建一个材质,改名成自己想要的后调整参数。

     

    设置好需要的值之后,就把该Material拖入到对象的Collider里的Material框里就可以了。

     

    完毕。

    展开全文
  • 思路:下面的图片是x轴对称的,所以这个旋转也是以图片箭头开始旋转的。(为什么?可能跟Atan2有关),根据鼠标点击的位置与图片的位置计算旋转角度,在Quaternion.Slerp进行旋转. 步骤:1,private Vector3 ...
    目标:鼠标点击后,图片朝向鼠标点击的地方
    涉及到:Mathf.Atan2(反正是计算角度的),rotation,Quaternion.Slerp
    思路:下面的图片是x轴对称的,所以这个旋转也是以图片箭头开始旋转的。(为什么?可能跟Atan2有关),根据鼠标点击的位置与图片的位置计算旋转角度,在Quaternion.Slerp进行旋转.


    步骤:1,private Vector3moveDirection;//向量,
                                    public float turnSpeed;//旋转速度
    2:void Update()下面
              moveDirection=newPos-transform.position;
             moveDirection.z=0;//这个2d下,可能写不写无所谓
             moveDirection.Normalize();
    3:float target = Mathf.Atan2(moveDirection.y,moveDirection.x)*Mathf.Rad2Deg;
    4:transform.rotation=Quaternion.Slerp(transform.rotation,Quaternion.Euler(0,0,target),turnSpeed*Time.deltaTime);
    结束:3,4都是update下面,这样接上
    【功能实现】之一的教程,可以鼠标点击物体移动又能头部朝着点的方向前进了


    展开全文
  • 以下是在unity3d中对GUITexture进行环绕图片中心的简单缩放与旋转的例子: public class ScaleAndRotationGuiTexture: MonoBehaviour { /// /// 将使用到的GUISkin /// public GUISkin mySkin; /// ...

    以下是在unity3d中对GUITexture进行环绕图片中心的简单缩放与旋转的例子:


    public class ScaleAndRotationGuiTexture: MonoBehaviour
    {
    /// <summary>
    /// 将使用到的GUISkin
    /// </summary>
    public GUISkin mySkin;

    /// <summary>
    /// 变换焦点
    /// </summary>
    private Vector2 pivotPoint;

    /// <summary>
    /// 初始缩放向量
    /// </summary>
    private Vector2 scale = new Vector2(1, 1);

    /// <summary>
    /// 旋转角度
    /// </summary>
    private float rotAngle = 0;

    /// <summary>
    /// Texture的位置
    /// </summary>
    private Rect imgPosition = new Rect(100, 100, 320, 240);

    protected void OnGUI () {
    GUI.skin = mySkin;
    Texture bg = GUI.skin.GetStyle("test").normal.background;

    if (GUI.Button(new Rect(Screen.width / 2 - 25, Screen.height / 2 - 25, 50, 50), "放大!"))
    {
    scale += new Vector2(0.15F, 0.15F);
    }

    if (GUI.Button(new Rect(Screen.width / 2 - 90, Screen.height / 2 - 25, 50, 50), "缩小!"))
    {
    scale -= new Vector2(0.15F, 0.15F);
    }

    if (GUI.Button(new Rect(Screen.width / 2 - 150, Screen.height / 2 - 25, 50, 50), "左旋"))
    {
    rotAngle += 10;
    }

    if (GUI.Button(new Rect(Screen.width / 2 - 210, Screen.height / 2 - 25, 50, 50), "右旋!"))
    {
    rotAngle -= 10;
    }


    pivotPoint = new Vector2(imgPosition.x + imgPosition.width / 2, imgPosition.y + imgPosition.height / 2);//(Screen.width / 2, Screen.height / 2);
    GUIUtility.ScaleAroundPivot(scale, pivotPoint);
    GUIUtility.RotateAroundPivot(rotAngle, pivotPoint);

    GUI.DrawTexture(new Rect(100, 100, 320, 240), bg);
    }
    }

    展开全文
  • Vector2 direction = target.transform.position - transform.position;  float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;  transform.rotation = Quaternion.AngleAxis(angle, Vector3.....
  • 用键盘控制模型绕自身Y轴旋转过程中模型变换方向,哪位大神知道是怎么回事,应该这样处理?![图片说明](https://img-ask.csdn.net/upload/201512/28/1451311515_888999.png)![图片说明]...
  • Unity2D物理引擎是基于Box2D的,嘛,在这一点上cocos也不例外,其他的软件要做2D物理效果的话基本上也会用该引擎。Box2D本身是一个免费开源的物理引擎,由C++编写而成。   https://github.com/erincatto/Box2D,...
  • unity3d有没有获取当前物体运动方向的方法代码,velocity是当前物体速度向量,但是我只想要方向,或则把这个速度向量变成单位向量也行(x^2+y^2=1),有没有这样的方法???我现在是想要保证我的球碰撞后方向即使...
  • 程序版本 :unity 5.5.0f3 3D物体在2D平面中移动旋转
  • 大家好,今天博主继续为大家带来Unity3D游戏开发系列文章,我们接着在上一篇文章中最后留下的那几个问题来讲解Unity3D游戏开发的相关知识。在上一篇文章最后,我们留了这样几个问题:  1、人物范围控制,换句话说...
  • 由于在项目中要对一个贴图对象进行翻转,前后要执行不同的操作来达到不同的视觉效果,在这个问题上犯难了。 这样在两个动画效果翻转之间就能进行自己想要的操作,比如更换贴图等等 直接上代码, ...
  • 在这里本人用unity3D引擎新版本的2D系统来实现这个功能。  首先,让我们了解一下原理的理论知识。我们可以把敌人和玩家放到一个坐标系中,敌人是坐标是的原点((0,0)点),玩家是在这个坐标系中的一点。然后把...
  • unity2d 角色翻转问题

    2019-03-03 21:51:00
    同时按住上和左会出现角色翻转. 解决方法: 勾选 Freeze Rotation Z(停止2D刚体选择性地围绕Z轴旋转)
  • 教程基于http://pixelnest.io/tutorials/2d-game-unity/, 这个例子感觉还是比较经典的, 网上转载的也比较多. 刚好最近也在学习U3D, 做的过程中自己又修改了一些地方, 写篇文和大家一起分享下, 同时也加深记忆. 有...
  • 之前有记录过3D场景下物体的移动,是利用Input.GetAxis方法进行获取键盘的输入,然后在移动方向上施加一个力向量rigidbody rd=AddForce(new Vector3(x,0,y)*speed);进行前后左右的移动,今天在2D的学习中,发现了与...
  • Unity3D纹理旋转两种实现方法
  • Unity2d代码翻转人物左右方向的两种方法 一 通过代码改Flip翻转(此种方法不会改变碰撞体) 选择x是在x轴左右翻转(关于y轴对称翻转) SpriteRenderer spriteRenderer; spriteRenderer.flipX = true; 二通过改scale...
  • 1.PointEffector2D,模拟2D排斥与吸引效果。 2.SurfaceEffector2D,模拟2D物体表面方向力。 3.AreaEffector2D,模拟2D物体内部一个方向力。 4.PlatformEffector2D,模拟2D 物体平台的方向通过性。 5.Buoyancy ...
  • 第4天让狗吃了..... 然而今天让精灵给吃了....
1 2 3 4 5 ... 20
收藏数 2,490
精华内容 996