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

最近花了几天的时间来做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);//调入当前已经调用的场景


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章