2015-11-11 19:54:26 yuxikuo_1 阅读数 714
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

转载自:http://blog.csdn.net/myarrow/article/details/45846567

1. 简介

    在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。

2. 通过Transform组件移动物体

    Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。


2.1 Transform.Translate

       该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤。

       public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;

2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards

      Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。

2.3 Vector3.SmoothDamp

      该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。

2.4 Transform.position

       有时重新赋值position能更快实现我们的目标。

3. 通过Rigidbody组件移动物体

    Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。

    注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

3.1 Rigidbody.velocity

     设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

3.2 Rigidbody.AddForce

      给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。

3.3 Rigidbody.MovePosition

      刚体受到物理约束的情况下,移动到指定点。

4. 通过CharacterController组件移动物体

     CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

4.1 CharacterController.SimpleMove

     用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。

4.2 CharacterController.Move

     模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。


2020-03-04 09:37:46 SwordMaster8060 阅读数 2373
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

 本人一直喜欢开发战争题材的游戏,在此简单介绍一下坦克履带模拟器的工作原理:

如果地形是平面,也就是说场景地形没有崎岖不平,坦克履带的移动效果完全可以采用偏移坦克履带材质的贴图来实现,即采用UV动画。

如果地形崎岖不平,这时候如果开动坦克,履带就要有适应地形的表现效果,而不仅仅是偏移履带贴图,因此本人采用的方法如下:

(1)坦克的履带是蒙皮,并且在每个轮子的正中心的位置都绑定了骨骼,并且刷好权重,当然绑定骨骼这一步骤我是在3dmax中完成的:

(2)坦克轮子的运动采用轮体碰撞器来模拟:

(3)游戏运行时,坦克的轮体碰撞器由于直接和地面发生接触,运行时相对于坦克自身的垂直方向会不断产生位移,那么就记录下轮体碰撞器此时的位置信息,再将此位置信息赋值给对应位置的轮子模型和对应位置的轮子骨骼,又由于相应位置的轮子骨骼是和履带蒙皮绑定在一起的,轮子骨骼相对于坦克发生位移,就会带动对应部分的履带发生拉伸或挤压的形变效果,这样坦克的履带就可以很好地模拟适应地形的效果:

此坦克履带模拟器可以在Unity Asset Store上下载:

https://assetstore.unity.com/packages/slug/99013

这是本人编写的坦克履带模拟器的编辑器界面:

 

如果有技术上的疑问请给我发邮件

2019-02-22 17:20:51 weixin_44073359 阅读数 354
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity 3D坦克大战案列学习(一)
实现坦克移动和转向

using UnityEngine;
using System.Collections;
public class TankMovement : MonoBehaviour
{
    public float speed = 5;//移动速度
    public float angularSpeed = 5;//旋转速度
    public float number = 1;      //增加一个玩家的编号,通过编号区分不同的控制 
    public AudioClip idleAudio;//坦克行走音效
    public AudioClip drivingAudio;

   private AudioSource audio;//获取音效组件
    private Rigidbody rigidbody;//获取刚体组件
 void Start ()
    {
        rigidbody = this.GetComponent<Rigidbody>();
        audio = this.GetComponent<AudioSource>();
    }
    void FixedUpdate()
    {
    float v = Input.GetAxis("VerticalPlayer"+number);//对应键盘上面的上下箭头,当按下上或下箭头时触发
    rigidbody.velocity = transform.forward * v * speed;//通过刚体施加移动速度和旋转速度        
    float h = Input.GetAxis("HorizontalPlayer"+number);//对应键盘上面的左右箭头,当按下左或右箭头时触发
    rigidbody.angularVelocity = transform.up*h*angularSpeed;//通过刚体施加移动速度和旋转速度
    if (Mathf.Abs(h) > 0.1 || Mathf.Abs(v) > 0.1)//当行走大于0.1
        {
            audio.clip = drivingAudio;
            if(audio.isPlaying ==false)
            audio.Play();//播放音效
            }
            else
        {
            audio.clip = idleAudio;
            if (audio.isPlaying == false)
                audio.Play();//播放音效
}`
2012-09-14 12:39:11 htttw 阅读数 17492
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity3d之坦克大战(二)



这只是一个非常非常初级的教程。 Unity3d之真机测试(上)我们创建了一个初级的坦克,今天继续坦克大战的游戏。下面开始吧:



1.

首先我们要创建一个炮弹。打开3DS Max,为了简单,就画一个胶囊好了。在右边栏的扩展几何体中选择胶囊。然后选中工具栏的移动工具,将胶囊移动(0,0)处,如下所示:




并保存为tankBullet.max,同时导出为tankBullet.3DS:






2.

将tankBullet.3DS放到Assets目录下,unity3d会自动导入。把它托入到Scene窗口中,并调整到合适位置和大小,如下所示:





3.

我们只是拖入了一个材质,下面需要创建对应的Entity。选择GameObject-->Create Other-->Cube 创建一个Cube,并调整到合适位置和大小。同时将第二步创建的tankBullet材质拖到Cube中,是它们成为一体。为了清晰,我们把Cube重命名成tankBulletCube。完成后结果如下:





4.

tankBulletCube增加物理感应。选中tankBulletCube,选择Component-->Physics-->Rigidbody。



5.

玩家按下空格键的时候发射导弹。我们用创建的导弹做Prefab(Prefab是大量重复的小Entity):

首先在Project窗口中创建一个Prefab文件夹,然后右击,选择Create-->Prefab,输入名称tankBulletPrefab,如下所示:




可以看到,一开始tankBulletPrefab前的图标是灰的:




把我们创建的tankBulletCube拖动到tankBulletPrefab中就会看到,图标变成蓝色的了:





6.

下面我们在Scripts文件夹下新建一个tankBulletFire.js脚本,用来控制导弹的发射,如下:

var FirePoint:Transform;
var Bullet:Rigidbody;

function Update ()
{
	if(Input.GetKeyDown(KeyCode.Space))
	{
		var clone : Rigidbody;
		clone = Instantiate(Bullet, FirePoint.position, FirePoint.rotation);
		clone.velocity = transform.TransformDirection(Vector3.forward * 100);
	}
}

代码中有两个变量:FirePoint和Bullet。前者是发射炮弹的起点,后者则是实际的炮弹。如果玩家按下空格,则我们在FirePoint的地方实例化一个Bullet,并设置它向前运动。




7.

下面我们创建发射炮弹的起点。选择GameObject-->Create Empty,并命名为FirePoint。同时将它的位置调整到坦克炮口前方(离炮口必须有一点距离,否则由于坦克和炮弹都是Rigidbody,一发射就会碰撞),同时还要把它加入到坦克Cube中。完成后如下所示:





8.

tankBulletFire.js脚本拖动到Cube,注意到此时FirePoint和Bullet还是None的:



FirePoint和tankBulletPrefab分别拖动到FirePoint和Bullet的,完成后如下所示:





9.

下面运行游戏,按下空格键,我们的炮弹就发射出来了(下图的小白点),同时注意到Hierarchy窗口中会出现大量的tankBulletPrefab





10.

炮弹发射后应该会有白光。选择GameObject-->Create Other-->Particle System创建例子系统,并命名为tankBulletParticleSystem,调整大小和数量,如下所示:





11.

tankBulletParticleSystem加入到tankBulletCube中。再次运行程序,我们的炮弹是不是漂亮很多了,哈哈:





12.

我们需要在炮弹打到物体或飞行一段距离后自动销毁。

新建一个tankBulletDestroy.js脚本,输入:

function OnCollisionStay(collisionInfo : Collision)
{
	//yield WaitForSeconds(2.0);  //等待2秒
	Destroy(gameObject);
}

OnCollisionStay这个函数会在物体发生碰撞后被调用。我们在碰撞后立即销毁。哈哈,测试一下。




13.

是不是单调了点?我们给发射导弹加上音效吧:

在Project窗口新加一个Audio文件夹,拖入声音文件,如下所示:






14.

给坦克Cube加入一个Audio Source。选择坦克Cube,选择GameObject-->Create Empty,命名为tankBulletFireSound。选中它,选择Component-->Audio-->Audio Source,然后将声音文件拖入Audio Clip一栏,并把tankBulletFireSound加入坦克Cube中,同时注意去掉Play On Awake复选框(否则程序一开始就会发声)






15.

下面我们修改tankBulletFire.js脚本来加入声音的控制:

var FirePoint:Transform;
var Bullet:Rigidbody;
var tankBulletFireSound:AudioSource;

function Update ()
{
	if(Input.GetKeyDown(KeyCode.Space))
	{
		var clone : Rigidbody;
		clone = Instantiate(Bullet, FirePoint.position, FirePoint.rotation);
		clone.velocity = transform.TransformDirection(Vector3.forward * 100);
		tankBulletFireSound.Play();
	}
}


同时将坦克Cube的tankBulletFireSound拖入脚本的tankBulletFireSound变量中:





16.

测试一下,发射导弹时,是不是也有声音啦,哈哈~~








完成!

2014-02-26 21:45:02 Vivian8725118 阅读数 1143
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。



这只是一个非常非常初级的教程。 Unity3d之真机测试(上)我们创建了一个初级的坦克,今天继续坦克大战的游戏。下面开始吧:



1.

首先我们要创建一个炮弹。打开3DS Max,为了简单,就画一个胶囊好了。在右边栏的扩展几何体中选择胶囊。然后选中工具栏的移动工具,将胶囊移动(0,0)处,如下所示:




并保存为tankBullet.max,同时导出为tankBullet.3DS:






2.

将tankBullet.3DS放到Assets目录下,unity3d会自动导入。把它托入到Scene窗口中,并调整到合适位置和大小,如下所示:





3.

我们只是拖入了一个材质,下面需要创建对应的Entity。选择GameObject-->Create Other-->Cube 创建一个Cube,并调整到合适位置和大小。同时将第二步创建的tankBullet材质拖到Cube中,是它们成为一体。为了清晰,我们把Cube重命名成tankBulletCube。完成后结果如下:





4.

tankBulletCube增加物理感应。选中tankBulletCube,选择Component-->Physics-->Rigidbody。



5.

玩家按下空格键的时候发射导弹。我们用创建的导弹做Prefab(Prefab是大量重复的小Entity):

首先在Project窗口中创建一个Prefab文件夹,然后右击,选择Create-->Prefab,输入名称tankBulletPrefab,如下所示:




可以看到,一开始tankBulletPrefab前的图标是灰的:




把我们创建的tankBulletCube拖动到tankBulletPrefab中就会看到,图标变成蓝色的了:





6.

下面我们在Scripts文件夹下新建一个tankBulletFire.js脚本,用来控制导弹的发射,如下:

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

代码中有两个变量:FirePoint和Bullet。前者是发射炮弹的起点,后者则是实际的炮弹。如果玩家按下空格,则我们在FirePoint的地方实例化一个Bullet,并设置它向前运动。




7.

下面我们创建发射炮弹的起点。选择GameObject-->Create Empty,并命名为FirePoint。同时将它的位置调整到坦克炮口前方(离炮口必须有一点距离,否则由于坦克和炮弹都是Rigidbody,一发射就会碰撞),同时还要把它加入到坦克Cube中。完成后如下所示:





8.

tankBulletFire.js脚本拖动到Cube,注意到此时FirePoint和Bullet还是None的:



FirePoint和tankBulletPrefab分别拖动到FirePoint和Bullet的,完成后如下所示:





9.

下面运行游戏,按下空格键,我们的炮弹就发射出来了(下图的小白点),同时注意到Hierarchy窗口中会出现大量的tankBulletPrefab





10.

炮弹发射后应该会有白光。选择GameObject-->Create Other-->Particle System创建例子系统,并命名为tankBulletParticleSystem,调整大小和数量,如下所示:





11.

tankBulletParticleSystem加入到tankBulletCube中。再次运行程序,我们的炮弹是不是漂亮很多了,哈哈:





12.

我们需要在炮弹打到物体或飞行一段距离后自动销毁。

新建一个tankBulletDestroy.js脚本,输入:

  1. function OnCollisionStay(collisionInfo : Collision)  
  2. {  
  3.     //yield WaitForSeconds(2.0);  //等待2秒  
  4.     Destroy(gameObject);  
  5. }  

OnCollisionStay这个函数会在物体发生碰撞后被调用。我们在碰撞后立即销毁。哈哈,测试一下。




13.

是不是单调了点?我们给发射导弹加上音效吧:

在Project窗口新加一个Audio文件夹,拖入声音文件,如下所示:






14.

给坦克Cube加入一个Audio Source。选择坦克Cube,选择GameObject-->Create Empty,命名为tankBulletFireSound。选中它,选择Component-->Audio-->Audio Source,然后将声音文件拖入Audio Clip一栏,并把tankBulletFireSound加入坦克Cube中,同时注意去掉Play On Awake复选框(否则程序一开始就会发声)






15.

下面我们修改tankBulletFire.js脚本来加入声音的控制:

  1. var FirePoint:Transform;  
  2. var Bullet:Rigidbody;  
  3. var tankBulletFireSound:AudioSource;  
  4.   
  5. function Update ()  
  6. {  
  7.     if(Input.GetKeyDown(KeyCode.Space))  
  8.     {  
  9.         var clone : Rigidbody;  
  10.         clone = Instantiate(Bullet, FirePoint.position, FirePoint.rotation);  
  11.         clone.velocity = transform.TransformDirection(Vector3.forward * 100);  
  12.         tankBulletFireSound.Play();  
  13.     }  
  14. }  


同时将坦克Cube的tankBulletFireSound拖入脚本的tankBulletFireSound变量中:





16.

测试一下,发射导弹时,是不是也有声音啦,哈哈~~








完成!

没有更多推荐了,返回首页