2016-09-16 21:53:16 u014488388 阅读数 373

1.摄像机的简单设置

设置一个空的物体,让摄像机在这个物体的子目录中。

将坦克、空物体、摄像机的位置参数全部清零。

调整摄像机的位置参数,设置好视角。

在代码中,将坦克的位置坐标赋给空物体。


原理是:摄像机在空物体的子目录下,摄像机的坐标原点就变成了空物体,注意摄像机包括旋转也是和空物体同步的。

空物体的位置坐标和坦克相同,所以能够是摄像机照到坦克。

空物体不获得坦克的旋转参数,所以坦克旋转时,摄像机不旋转。


代码:

using UnityEngine;
using System.Collections;

public class tankCamera : MonoBehaviour {

	public Transform target;//拖动坦克到此
	
	// Update is called once per frame
	void LateUpdate () {  //在坦克到位之后再更新
		transform.position = target.position;
	
	}
}

注意在视图中,将坦克拖动到target



LateUpdate  最后更新,避免晃动。



2015-11-30 00:14:41 foso1994 阅读数 8861
using UnityEngine;
using System.Collections;

public class TankCamera : MonoBehaviour {

    public Transform  target;


    void LateUpdate () {//执行完所有update之后再执行的程序,为了防止出现摄像机的update先执行而出现的闪烁,所有相机的函数都用lateupdate
        transform.position = target.position;//摄像机的位置等于target(坦克)的位置.
    }

}



设一个跟目标物体坐标相同的空物体,(可先设为子物体后拖出)之后将摄像机设为该物体的子物体,调整方向。

之后使得空物体的坐标始终等于目标物体。(程序即为此)这样即可使摄像机始终跟随目标物体,且不随其旋转。(因为空物体只是坐标相等,并未旋转)

注:脚本要添加到空物体上,而不是摄像机上。


LateUpdate的作用:因为多个update函数是先后顺序是随机的,所以可能摄像机先update而物体还未移动,而下一帧是若物体先update那么就会出现瞬移的情况。多数摄像机都要加上LateUpdate,即所有场景内的调用结束后再更新摄像机。

2016-09-16 21:03:01 u014488388 阅读数 349

1.Unity3D环境和坦克大战的图形资源都可以在官网上下载到。

官网:https://unity3d.com/    在learn的子选页中含有很多很丰富的教程和资源,本身软件也包含免费版,基本够实用。

坦克大战的教程,参见优酷,搜索“Unity3D坦克大战项目实例”


2.Game窗口是run时候显示的窗体,是摄像机的画面,要想改变GAME窗体的显示,需要在Sence改变摄像机的位置。运行时,可以显示按键控制坦克移动;

Sence是编辑的窗体,不能显示按键移动(运行效果)。

当光标选中GAME窗体后,才有运行效果显示。


3.官网工程只能够使用Unity3D下载。

4.在edit->preference中可以设置代码的编辑器,自带的是MonoDevelop,兼容VS2015,(vs2012测试未通过)


5.第一阶段的代码(实现坦克的前进、后退、旋转,C#)

using UnityEngine;
using System.Collections;

public class tank : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	public float moveSpeed;
	public float rotateSpeed;
		
	// Update is called once per frame
	void Update () {
		if(Input.GetKey(KeyCode.W)) {
			transform.Translate (new Vector3 (0, 0, 1) * moveSpeed * Time.deltaTime);
		}
		if(Input.GetKey(KeyCode.S)){
			transform.Translate (new Vector3(0,0,1) * -moveSpeed * Time.deltaTime);
		}
		if (Input.GetKey (KeyCode.A)) {
			transform.Rotate (new Vector3 (0, 1, 0) * -rotateSpeed * Time.deltaTime);
		}
		if (Input.GetKey (KeyCode.D)) {
			transform.Rotate (new Vector3 (0, 1, 0) * rotateSpeed * Time.deltaTime);
		}
	}
}
其实:

transform.Translate (new Vector3 (0, 0, 1) * moveSpeed * Time.deltaTime);
等价于
transform.Translate (new Vector3 (0, 0, moveSpeed)  * Time.deltaTime);

修改后的代码:

using UnityEngine;
using System.Collections;

public class tank : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	public float moveSpeed;
	public float rotateSpeed;
		
	// Update is called once per frame
	void Update () {
		if(Input.GetKey(KeyCode.W)) {
			transform.Translate (Vector3.forward * moveSpeed * Time.deltaTime);
		}
		if(Input.GetKey(KeyCode.S)){
			transform.Translate (Vector3.forward * -moveSpeed * Time.deltaTime);
		}
		if (Input.GetKey (KeyCode.A)) {
			transform.Rotate (Vector3.up * -rotateSpeed * Time.deltaTime);
		}
		if (Input.GetKey (KeyCode.D)) {
			transform.Rotate (Vector3.up * rotateSpeed * Time.deltaTime);
		}
	}
}

6.注意手册的使用


2017-08-23 09:04:05 weixin_39650237 阅读数 821

1 创建工程 场景
3D工程
导入素材
导入场景,删除自带直射光,lighting 中 Scene 中的Auto 勾选取消,Ambient Source 改成 color 改一下映射颜色
摄像机中的映射颜色 改一下
摄像机中的Projection改一下Size改一下

2 场景中添加坦克,控制其移动
冒烟效果预制体
Box Collider
Rigidbody
把坦克做成PreFabs
添加脚本控制移动
定义速度
FixedUpdate()中用rigidbody.velocity = transform.forward*v(Vertical)*speed控制移动
锁定一下 x y position 和 x rotation

3 控制坦克的旋转
h(Horizontal)得到水平的值
rigidbody.angularVelocity = transform.up*h*旋转速度

4 修改坦克控制的灵活性(增加坦克的编号)
Edit
Project Setting InputManager修改一下Horizontal和Verital的按键
增加编号区分控制

5 控制坦克子弹的发射
添加碰撞器和刚体
Tank下创建一个空的游戏物体,放在炮口
新建脚本控制
得到空物体的Transform以及子弹的shellPrefabs
按键设置
将子弹预制体实例化到空物体的Transform

6 控制炸弹的飞行和爆炸
飞行速度
得到子弹的刚体组件.velocity = go.transform.forward*shellspeed
在子弹上添加脚本控制爆炸
子弹添加触发器
销毁自身,实例化爆炸特效预制体,
在特效上添加脚本控制特效的销毁

7 控制炸弹对坦克的伤害
坦克身上添加Tag
collider.SendMessage(“TakeDamage”);
新建脚本控制坦克血量
判断是否死亡,(血量减少前先判断一次,如果已经死亡就直接return)
实例化坦克爆炸预制体
销毁自身

8 控制相机视野的跟随
视野设定在两个坦克的正中心
相机上新建脚本
得到两个坦克的transform
offset 相机的位置减去两个坦克的中心位置
相机的transform等于中心位置加上offset
保持Size和两个坦克位置的比例
camera.size =size;
如果有一个Tank被销毁了,就return(游戏结束)

9 添加游戏音效
空游戏物体控制背景声音
坦克爆炸音效
AudioSource.PlayClipAtPoint(音效,位置)
发射子弹的声音
子弹爆炸的声音

10 添加坦克音效
坦克身上添加AUDIO SOURCE组件默认播放IDLE
Movement中控制
if判断如果h,v不等于0则播放移动的音效
else播放Idle

11 添加血条
UI-Slider
修改一下大小,贴图
Fill Background修改成上下左右填充
Canvas设置成world space
public Slider hpSlider;
Slider的Value值的大小是0-1的

12 UI控制
回合数
比分
重玩

2019-11-25 10:23:15 Hanayo_ 阅读数 45

一、 迭代目标

(1)设计地形
(2)导入我方坦克模型
(3)控制键盘使我方坦克向四周移动
(4)增加一个小地图

二、项目开发团队

开发单位:武汉大学计算机学院2017级大型应用软件设计小组——余毅,罗廷锋,郭文轩,王思灏,旦增平措,王睿婕,吴祖瑞
项目开发名称:基于Unity的坦克大战小游戏
本软件运行平台:Windows 10

三、第一轮迭代成果

设计地形

使用导入高度图的方式
在这里插入图片描述
活用树木,草地等细节工具,美化地形如下

在这里插入图片描述

模型导入我方坦克

游戏使用的模型坦克,其实分为3个部分:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

美化地形

加入方向光,引入SkyBox
在这里插入图片描述
在这里插入图片描述

小地图和摄像机

整个系统存在两部摄像机,其中主摄像机以一定角度尝试拍摄整个场景:
在这里插入图片描述
另外一部摄像机将跟随我方坦克,进行移动拍摄,即形成以下效果:因此,需要架设一部摄像机跟随我方坦克进行移动

在这里插入图片描述

我方坦克的移动控制

由于坦克由三部分构成,这里考虑,WASD控制的是坦克本身的移动,另外设置键RF来控制炮管的运动。WS键只需要让坦克沿着Vector3.forward和Vector3.back,按照一定的速度移动即可。AD键是一个旋转的过程,A键是逆时针旋转运动,D键是顺时针运动。

坦克上半部可以左右旋转,这里用Q和E键处理,其旋转时候,坦克身体部分不动,所以需要单独处理。
在这里插入图片描述

四、第二轮迭代目标

(1)添加敌方坦克,只在目标区域移动

(2)实现炮口的上下,左右移动

(3)实现攻击,击中所有目标胜利

(4)实现受击,被击中一下则死亡

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