• [Unity3D]简单的物体运动和外力作用


    下面简单学习一下在Unity中物体的移动。

    和上面两篇文章相同,我们先创建一个简单的场景以便测试。

    PS:场景可以建在同一个Project中,在Project面板点击场景文件进行切换即可。

    物体有:点光源一个,小方块一只。

    效果如下:

    然后将js文件拖到Hierarchy面板的立方体上实现绑定。我们现在要实现的就是让场景中的立方体延X轴移动。

    在Project中右击新建一个JS脚本Creat->Javascript

    键入代码:

    [javascript] view plaincopyprint?

    1. function Update () 
    2.     transform.Translate(Vector3(1,0,0)); 
    function Update ()
    {
    	transform.Translate(Vector3(1,0,0));
    }

    运行一下,我们可以看到,立方体嗖的一声不见了。

    甚至快的我都没看到它是怎么消失的!这样可不行。

    需要修改代码让它慢一点。

    [javascript] view plaincopyprint?

    1. function Update () 
    2.     transform.Translate(Vector3(1,0,0)*Time.deltaTime); 
    function Update ()
    {
    	transform.Translate(Vector3(1,0,0)*Time.deltaTime);
    }
    运行一下,这会它老实了,慢慢的移动了。

    这是怎么回事呢。接下来我们一步一步的将代码分解。

    transform:场景中的每一个对象都有一个transform,用来储存和控制物体的位置,旋转和缩放。

    Translate:是transform的函数,用来移动物体。它接受一个三维向量(Vector3)参数来移动。其实它还有第二个参数,就是按照自身坐标轴移动还是按照世界坐标轴移动。这里暂且不表。

    Vector3:表示3D的向量和点。3个参数分别代表了向量x,y,z。

    transform.Translate(Vector3(1,0,0));这句代码的意思就是,让被绑定的物体,也就是场景中的立方体,向x轴的方向移动1个单位.

    Time.deltaTime:是一个时间增量,我想应该是这一帧的时间。像flash中的一秒30帧,每帧多少秒之类的。在这个程序中它的值是0.016左右。原本移动一个单位,现在乘以0.016,那肯定慢了。也就是说,它的作用其实就是减慢移动的速度。

    但是仅仅这样简单的移动很难满足我们的需求,下面简单的学习一下如何给这个方块一个外力的作用。

    说白了就是,一脚把他踹出去!

    我们新建一个Scene,然后添加方块和地板形成如下场景:

    然后我们新建一个JS脚本命名为GiveForce。

    在脚本的
    start方法中添加以下代码:

    [javascript] view plaincopyprint?

    1. function Start() 
    2.     rigidbody.AddForce(Vector3(0,0,500)); 
    function Start()
    {
    	rigidbody.AddForce(Vector3(0,0,500));
    }
    然后可以运行一下看看效果,哇哦~没有反应 - -

    原来是忘了把这个脚本拖到Cube对象上。。

    拖上去之后便会看到小方块被一脚踹出去啦。

    至此,我们的简单移动和外力移动便实现了。

    下面我们来模拟一个发射炮弹的事件。

    我们先创建好子弹和坦克,然后创建一个Prefab放置在Project中,并将炮弹拖到Prefab上面。

    接下来新建一个JavaScript文件,命名为Fire,代码如下:

    [javascript] view plaincopyprint?

    1. var FirePoint:Transform; 
    2. var Bullet:Rigidbody; 
    3. function Update () { 
    4. if(Input.GetKey(KeyCode.Space)){ 
    5. var clone:Rigidbody; 
    6.         clone = Instantiate(Bullet,FirePoint.position,FirePoint.rotation); 
    7.         clone.velocity = transform.TransformDirection(Vector3.forward*100); 
    8.     } 
    var FirePoint:Transform;
    var Bullet:Rigidbody;
    
    function Update () {
    	if(Input.GetKey(KeyCode.Space)){
    		var clone:Rigidbody;
    		clone = Instantiate(Bullet,FirePoint.position,FirePoint.rotation);
    		clone.velocity = transform.TransformDirection(Vector3.forward*100);
    	}
    }

    本文转自:http://blog.csdn.net/wxg694175346/article/details/8290387

  • 相关阅读:
    layui日历控件设置选择日期不能超过当前日期
    layui表格工具条,如何动态控制按钮的展示?
    celery定时任务
    redis的安装(windows+linux)
    redis常用操作
    mac通过virtualbox安装win10
    制作U盘启动盘
    k8s报错: * spec.template.spec.volumes[0].name: Invalid value: "nfs_pvc001": must match the regex [a-z0-9]([-a-z0-9]*[a-z0-9])? (e.g. 'my-name' or '123-abc')
    k8s的容器的端口暴露
    k8s中pod文件的定义格式
  • 原文地址:https://www.cnblogs.com/dacheng/p/2977311.html
Copyright © 2020-2023  润新知