您的位置:首页 > 移动开发 > Unity3D

Unity3D官方案例--SurvivalShooter游戏总结

2015-08-30 22:38 573 查看
最近花了几天的时间来做U3D的案例,官方的案例SurvivalShooter,虽然一些游戏模型以及场景都是下载的,但是视频教程中对于自身对游戏逻辑的理解还是很有帮助的,所以今天做完趁热来总结一下。

1.首先是在一个3d游戏中实现游戏主角移动的功能:代码如下

想要读取轴向使用Input.GetAxis方法获取下列默认轴: "Horizontal" 和"Vertical" 映射于控制杆、A、W、S、D和箭头键(方向键)。 "Mouse X" 和"Mouse Y" 映射于鼠标,"Fire1", "Fire2" "Fire3"映射于键盘的Ctrl、Alt、Cmd键和鼠标中键或控制器的按钮。新的输入设置可以使用输入管理器来添加。

//实现人物移动的封装方法

float h = Input.GetAxisRaw ("Horizontal");//获取水平方向上的值

float v = Input.GetAxisRaw ("Vertical");//获取垂直方向上的值

void Move(float h,float v){

movement.Set (h, 0.0f, v);//movement是个vector3的变量

movement = movement.normalized*speed*Time.deltaTime;//规格化之后,返回一个与原来方向相同的但是长度为1的向量

playerRigidBody.MovePosition (transform.position + movement);//移动到这个位置

}

2.第二是实现人物随着鼠标的转动而转动的封装方法

int floorMask;//地面碰撞层

float camRayLength = 100f;//发射出去射线的长度

//实现人物随着鼠标的移动而进行转动的封装方法

void Turning(){

Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);//从摄像机发出一条起点为摄像机,终点为当前鼠标所在位置的射线,并且返回这条射线,记录了射线的起点和方向

RaycastHit floorHit;//用来获取从raycast函数中得到的信息反馈的结构

if(Physics.Raycast(camRay,out floorHit,camRayLength,floorMask)){//当光线投射与任何碰撞器交叉时为真,否则为假

Vector3 playerToMouse = floorHit.point - transform.position;//floorHit.point 指的是再世界空间中,光线碰撞到碰撞器的碰撞点

playerToMouse.y = 0f;

Quaternion newRotation = Quaternion.LookRotation(playerToMouse);//创建一个旋转,沿着forward(z轴)并且头部沿着upwards(y轴)的约束注视。也就是建立一个旋转,使z轴朝向view y轴朝向up。

playerRigidBody.MoveRotation(newRotation);

}

}

3.实现摄像机跟随人物的代码

public Transform target;

public float smoothing = 5f;//平滑的速度值

Vector3 offset;//摄像机和人物的相对位置

// 由于人物是动态变化的,所以必须先计算出人物与摄像机的相对位置,然后再实时的获取并更新摄像机的位置

void Start () {

offset = transform.position - target.position;

}

//摄像机实时跟随人物进行移动

void FixedUpdate () {

Vector3 tarCamPosition = target.position + offset;//摄像机的目标位置等于当前的摄像机位置加上相对位置

transform.position = Vector3.Lerp (transform.position, tarCamPosition, smoothing * Time.deltaTime);//以某个速度从一个位置到另一个位置的函数

}

4.怪物自动追踪主角的功能:

可以通过添加NavMeshAgent组件来实现,并且在代码中用NavMeshAgent的setDestination的方法来设置追踪对象的位置

5.怪物的攻击范围的实现可以通过给怪物加上一个碰撞体组件,比如球形碰撞体,胶囊碰撞体等等,如果碰撞体的触发器触发,说明到了怪物的攻击范围.如果退出了触发器,那么说明目标脱离的攻击范围,可以灵活的使用OnTriggerEnter与OnTriggerExit来实现.

6.当要使用游戏物体的子对象时,可以通过FindGameObjectWithTag来找到,并对找到的对象的成员以及方法进行操作,当然,前提是该对象必须要有相应的tag;

7.让怪物死亡之后下沉到地面,这是很常用的一种对怪物对象的处理方式,当然,得销毁怪物对象,不然对象太多内存扛不住;

transform.Translate(-Vector3.up * sinkSpeed *Time.deltaTime);//让物体以一定的速度下沉,并且要先让运动学这个属性生效才能下沉。isKinamatic这个属性要为true

8.要让游戏在相应的时刻播放相应的动画时,那么先要获取到动画Animator的对象,然后通过设置动画播放时的参数来进行动画的播放控制,比如setTrigger方法,setBool方法等。

9.一般实现怪物动态生成的方法是:将怪物生成的代码封装成函数,然后再start函数中通过InvokeRepeating函数来反复的进行调用,下面是SurvivalShooting中进行怪物生成的封装方法:

//生成怪物封装的方法

void Spawn(){

if (playerHealth.currentHealth <= 0) {

return;

}

int pointIndex = Random.Range(0,spawnPoints.Length);

Instantiate (enemy, spawnPoints [pointIndex].position, spawnPoints [pointIndex].rotation);

}

反复的初始化对象来进行怪物的生成!

10.让游戏结束之后再次调入游戏场景,游戏重新开始:

Application.LoadLevel (Application.loadedLevel);//调入当前已经调用的场景
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: