unity3d 获取物体胡方向_unity3d获取物体下面的子物体 - CSDN
  • 有时候对于一个游戏对象,需要其沿着自身的坐标轴方向进行运动,那么首先如何获取自身的坐标轴方向获取自身的坐标轴方向可以通过transform组件进行获取(负方向加负号即可)  Vector3 moveDirection = transform...

    有时候对于一个游戏对象,需要其沿着自身的坐标轴方向进行运动,那么首先如何获取自身的坐标轴方向?

    获取自身的坐标轴方向可以通过transform组件进行获取(负方向加负号即可)

     Vector3 moveDirection = transform.right;  获取自身的x轴的方向

     Vector3 moveDirection = transform.forward;  获取自身的z轴的方向

     Vector3 moveDirection = transform.up;  获取自身的y轴的方向

    下面举例说明,假设在场景中创建一个Cylinder圆柱体对象,如下:


    下面测试代码,使其沿着自身坐标x轴(即红色轴线)进行运动,脚本MoveControl代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MoveControl : MonoBehaviour {
    
        private float speed = 1.0f;
    
    	// Use this for initialization
    	void Start () {
         
        }
    	
    	// Update is called once per frame
    	void Update () {
            Vector3 moveDirection = transform.right;
            transform.position += moveDirection * Time.deltaTime * speed;
           // transform.Translate(Vector3.right * Time.deltaTime * speed, Space.Self);
    	}
    
    }
    
    下面将脚本添加到场景中的Cylinder对象,测试其运动如下:



    通过观察物体运动可知,正好符合我们的需求。

    另外注意看我代码中标红的部分,还有另外一种方法,也可以实现沿着坐标轴的运动,代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MoveControl : MonoBehaviour {
    
        private float speed = 1.0f;
    
    	// Use this for initialization
    	void Start () {
         
        }
    	
    	// Update is called once per frame
    	void Update () {
           transform.Translate(Vector3.right * Time.deltaTime * speed, Space.Self);
    	}
    
    }
    即可以在平移函数里面,直接改变参考坐标系参数为Space.Self,经测试效果一样。



    展开全文
  • unity3d有没有获取当前物体运动方向的方法代码,velocity是当前物体速度向量,但是我只想要方向,或则把这个速度向量变成单位向量也行(x^2+y^2=1),有没有这样的方法???我现在是想要保证我的球碰撞后方向即使...
  • unity3D物体实现任意角度自旋转

    万次阅读 2015-05-19 13:40:44
    unity3D物体实现任意角度自旋转

    主要涉及函数:

    Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量

    Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量

    通过勾股定理获取拖拽长度,长度越长旋转越快。在project setting--Input 可以设置。

    这里用Cube来做例子,因为方体看旋转比较清楚,如图:


    代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class NewBehaviourScript : MonoBehaviour {
    
    	private bool onDrag = false;  //是否被拖拽//    
    	public float speed = 6f;   //旋转速度//    
    	private float tempSpeed;   //阻尼速度// 
    	private float axisX = 1;
    	//鼠标沿水平方向移动的增量//   
    	private float axisY = 1;    //鼠标沿竖直方向移动的增量//   
    	private float cXY;
    	void OnMouseDown()
    	{
    		//接受鼠标按下的事件// 
    		
    		axisX = 0f; axisY = 0f;
    	}
    	void OnMouseDrag()     //鼠标拖拽时的操作// 
    	{
    		
    		onDrag = true;
    		axisX = -Input.GetAxis("moveX");
    		//获得鼠标增量// 
    		axisY = Input.GetAxis("moveY");
    		cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY); //计算鼠标移动的长度//
    		if (cXY == 0f) { cXY = 1f; }
    		
    	}
    	float Rigid()      //计算阻尼速度//    
    	{
    		if (onDrag)
    		{
    			tempSpeed = speed;
    		}
    		else
    		{
    			if (tempSpeed > 0)
    			{
    				tempSpeed -= speed * 2 * Time.deltaTime / cXY; //通过除以鼠标移动长度实现拖拽越长速度减缓越慢// 
    			}
    			else { 
    				tempSpeed = 0; 
    			}
    		}
    		return tempSpeed;
    	}
    	
    	void Update()
    	{
    		// this.transform.Rotate(new Vector3(axisY, axisX, 0) * Rigid(), Space.World); //这个是是按照之前方向一直慢速旋转
    		if (!Input.GetMouseButton(0))
    		{ 
    			onDrag = false;
    			this.transform.Rotate(new Vector3(axisY, axisX, 0)*0.5f, Space.World); 
    		}
    	}
    }
    

    最终效果如图:




    展开全文
  • Unity3D和Flash一样,甚至可以说是和C#一样,拖完组件,再写一系列的脚本,完成编程,甚至可以说,就是带编程脚本的3DSMAX。那么如何完成最基本的物体、材质的设置、物体位移与旋转呢?下面用一个简单的Unity3D说明...

    Unity3D和Flash一样,甚至可以说是和C#一样,拖完组件,再写一系列的脚本,完成编程,甚至可以说,就是带编程脚本的3DSMAX。那么如何完成最基本的物体、材质的设置、物体位移与旋转呢?下面用一个简单的Unity3D说明这个问题,如下图所示:


    在一个面板上面有一个可以控制的立方体与不可以控制的球体和立方体各2个,然后可以控制立方体的位移与旋转。概念的东西就不写了,具体步骤如下。

    一、场景设置

    1、如下图所示,在GameObject里面,选择需要的东西,在场景一拖就可以创建相应的物体了。


    除了默认自带的摄像机和光源,我们要设置3个立方体,2个球,1个地面。

    在设置的时候,还可以像画图、Flash、C#那样用CTRL+C、CTRL+V复制、粘贴物体。

    2、之后,点击任意一个物体,再右边的Inspector就可以设置相应的属性。这和C#设置控件的基本控件,和Flash设置资源的属性不就是同一个意思吗?

    不过由于在3D界面不像2D那样好控制组件的位置,基本上我们是需要在Inspector界面的Transform项,直接输入坐标控制物体的位置。

    如下图所示(在没有设置材质之前,这些东西应该都是白色的),默认情况下,Y是上下方向,XZ是平面的纵横,这就是公认的三维笛卡儿坐标系设置,没什么好说的。


    各个组件的坐标Position,旋转Rotation和缩放Scale如下图所示。Position指坐标,物体中心点所处的位置,所以如果物体要放在Plane上面,则要处于Y轴0.5的位置,Rotation指的是物体绕哪一轴旋转的角度,Scale则是单位物体的XYZ轴半径沿此轴拓宽的多少。

    理论上,刚才GameObject中所有单位的立体靠各种坐标偏移,角度偏移与形变能表示三维世界的所有东西,就像二维世界的所有东西,是由点、直线、曲线所组成。


    3、物体设置好之后,我们则要给各个物体上色,也就是给各个物体贴上材质。这里不要有windows自带颜色版的惯性思维,“颜色”也就是材质,不是说有就有,直接能在Inspector中设置的,是需要我们自己新建的,具体如下:


    以上只是设置简单的纯色材质。材质的设置在3D领域同样是一种学问,就像如何用HTML+CSS的颜色配搭弄好一个网页一样。

    这里设置材质,只是基本的入门,未来这个方面肯定可以深究一番。

    现在游戏美工缺,高收入也就是因为如此,材质可以说是2D美工的3D版。

    言归正传,如图设置黑色材质给予地板,蓝色材质给予预设为不能动的物理,红色材质设定给我们中间的主角。

    4、至此,场景终于布置完毕,如下图所示,选择各个物体(2个球体、3个立方体),【Component】->【Physics】->【Rigidbody】,将所有物体设置为刚体,用于真实的物理碰撞之后,则可以进行脚本的编写。


    二、脚本编写

    显然按钮是通过脚本创建的。

    如何新建脚本在《【Unity3D】Helloworld》(点击打开链接)说过了,这里就不再赘述了。

    给予如下的脚本给中间的红色立方体。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine.SceneManagement;//重新开始游戏,切换场景SceneManager.LoadScene("Scene1");需要。
    using UnityEngine;
    
    public class script : MonoBehaviour
    {
    
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
    
        //初始化变换方法。
        public Transform transform;
        void Awake()
        {
            transform = this.GetComponent<Transform>();
        }
    
        float moveSpeed = 20;//物体移动速度
    
        void OnGUI()//OnGUI用于画面绘制
        {
            //这里的rect就是指在左上角坐标(10,10)这个100x30像素的区域位置。
            if (GUI.Button(new Rect(10, 10, 100, 30), "向左旋转30度"))//GUI.Button用于创建按钮
            {
                transform.Rotate(-Vector3.up * 30);//30就是指30度
            }
            if (GUI.Button(new Rect(110, 10, 100, 30), "向右旋转30度"))
            {
                transform.Rotate(Vector3.up * 30);
            }
            if (GUI.Button(new Rect(210, 10, 100, 30), "重新开始"))
            {
                SceneManager.LoadScene("Scene1");//Application下的方法已经被标识过期
            }
            if (GUI.Button(new Rect(10, 50, 100, 30), "向上移动"))
            {
                transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
            }
            if (GUI.Button(new Rect(110, 50, 100, 30), "向下移动"))
            {
                transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);//Time.deltaTime指一帧时间,这样据说可以平滑视觉差
            }
            if (GUI.Button(new Rect(210, 50, 100, 30), "向左移动"))
            {
                transform.Translate(-Vector3.right * moveSpeed * Time.deltaTime);
            }
            if (GUI.Button(new Rect(310, 50, 100, 30), "向右移动"))
            {
                transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
            }
            GUI.Label(new Rect(10, 100, 400, 30), "模型位置" + transform.position);//transform.position可以获取模型位置
        }
    }
    

    具体请看注释。

    Unity3D里面没有向后移动和像左移动,统一用负的.forward和负的.right实现。

    Vector3直接可以使用,无须初始化,一般是指给赋予脚本的对象。

    SceneManager.LoadScene("Scene1");在Unity3D内部调试时候,灯光会因场景重置变暗,但发布成exe之后不会有这样的问题。

    展开全文
  • unity 获取物体尺寸

    千次阅读 2014-05-20 12:13:45
    unity3d中获得物体的size 以size的x方向为例 1:gameObject.renderer.bounds.size.x;//这个值的结果真实反应出有MeshRenderer这个组件的模型的尺寸。不需要再乘以localScale.x。 2:gameObject.GetComponent...
    

    unity3d中获得物体的size

    以size的x方向为例

    1:gameObject.renderer.bounds.size.x;//这个值的结果真实反应出有MeshRenderer这个组件的模型的尺寸。不需要再乘以localScale.x。


    2:gameObject.GetComponent<MeshFilter>().mesh.bounds.size.x;//通过MeshFilter获得原始模型的mesh,该值返回的结果是原始mesh的尺寸。

    若要获得模型的尺寸大小还需要乘以模型的localScale.x。

    即:gameObject.GetComponent<MeshFilter>().mesh.bounds.size.x*gameObject.transform.localScale.x;


    3:为物体添加Collider,然后使用XXX.collider.bounds.size;

    这个不一定能很好的反应物体的大小,bounds获得的是物体的外包矩形。而且这个外包矩形的X,Y,Z和世界坐标一致。因此,若物体有旋转,获得的尺寸就不能反应出物体的真实大小,只是其外包矩形的大小。。。

    如:获得terrain的尺寸

            terrainWidth = terrain.collider.bounds.size.x;

            terrainLength = terrain.collider.bounds.size.z;

            terrainHeight = terrain.collider.bounds.size.y;

    4:代码实现获得复杂物体的尺寸(诸如根节点没有MeshFilter,MeshRenderer组件,物体是由很多复杂不规则的小mesh子物体组成的)
    如:





    Camera的口径Size

    当投影类型为Perspective时,fieldOfView属性表示口径的度数,范围为[1,179]

    当投影类型为Orthgraphic,     orthographicSize属性为正交模式下的口径尺寸

    展开全文
  • 以size的x方向为例 1:gameObject.renderer.bounds.size.x;//这个值的结果真实反应出有MeshRenderer这个组件的模型的尺寸。不需要再乘以localScale.x。 2:gameObject.GetComponent&lt;Mesh...
  • Unity3D控制物体移动

    万次阅读 2016-11-16 20:54:48
    在游戏开发中,游戏物体的移动是最基本的,如果连物体都移动不起来,那就不用说玩游戏了。 下面记录了自己在开发中实现的物体移动,不同项目可能有不同的物体移动实现,也有很多种不同的物体移动实现,文章会持续...
  • unity获取物体尺寸

    万次阅读 2017-03-09 20:45:23
    unity3d中获得物体的size 以size的x方向为例 1:gameObject.renderer.bounds.size.x;//这个值的结果真实反应出有MeshRenderer这个组件的模型的尺寸。不需要再乘以localScale.x。 2:gameObject.GetComponent...
  • 前文:https://blog.csdn.net/Jaihk662/article/details/86754532(利用Transform组件移动物体) ...多个物体的中心点:如果你选中了多个物体,那么这些物体整体的中心点在哪呢? Center:当选中多个模...
  • 【Unity】unity3d 获取手机地理位置

    千次阅读 2016-11-30 11:03:27
    怎么用unity3d 获取手机地理位置呢?unity的某些场景中,如果需要定位地理位置的话,但是unity却没有提供相应的接口。对于安卓(这里举例,IOS暂没研究)这个时候只能用java写个获取地理位置的方法,然后与unity交互...
  • * Rigidbody :刚体(具备物理属性的物体) ************************************************************************************************************************************   获取...
  • Unity 3D中很多时候我们会想要移动一个物体到别的位置,如让想人物跑动起来,或者想要移动相机来跟随人物。有很多种方法可以改变物体的坐标,实现移动的目的,移动的本质是在每一帧中修改物体的position。在这里把...
  • unity3D物体跟着鼠标移动

    千次阅读 2019-09-19 09:40:08
    原本以为只要将鼠标坐标转为世界坐标,然后将转换后的坐标赋给物体就能实现。经多次尝试发现,鼠标转成世界坐标之后缺一Z轴,所以想出的解决方案是先将要跟随的物体的世界坐标转成屏幕坐标,再把该屏幕坐标的Z轴赋给...
  • unity3d collision获取碰撞位置

    万次阅读 2014-09-13 19:27:38
    void OnCollisionEnter(Collision ctl) { ContactPoint contact = ctl.contacts[0]; Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal); Vector3 p
  • Unity3D 控制物体移动、旋转、缩放

    千次阅读 2014-07-04 14:02:39
    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【119706192】本文链接地址: Unity3D 控制物体移动、旋转、缩放 Transform基本移动函数: 1.指定方向移动: //移动速度 float ...
  • 这个问题其实很简单,但是弄了一两天才搞懂,关键在于对于世界坐标系和自身坐标系的区别,以及transform和Vector3中属性的区别 改变朝向直接向下面这样即可,但是要清楚,transform是世界坐标系下的概念,所以给...
  • Unity中,要使得物体朝向一个目标向量可以直接用transform.LookAt()实现。  那么有没有什么办法可以在不使用 transform.LookAt() 的前提下,直接计算出物体在调用... /// 获取物体LookAt后的旋转值  ///  ///
  • using UnityEngine; using System.Collections; public class ModelRotationScript : MonoBehaviour { public GameObject model; //目标物体 public Camera myCamera; //摄像机 Vector2 first = Vector2.zero;
1 2 3 4 5 ... 20
收藏数 3,429
精华内容 1,371
关键字:

unity3d 获取物体胡方向