Survial Shooter教程笔记

来源:互联网 发布:ktv盈利数据 编辑:程序博客网 时间:2024/05/22 15:03

该教程里有一些经典的使用脚本




角色移动、旋转
float h = Input.GetAxisRaw("Horizontal");//a d
float v = Input.GetAxisRaw("Vertical");//w s获取横轴纵轴输入
然后Vector3 movement = movement.normalized * speed * Time.deltaTime;//向前方向*速度=坐标位置 
最后使用对象身上的Rigidbody让对象移动到该位置playerRigidbody.MovePosition(transform.position + movement);//移动到该位置
角色跟随鼠标旋转原理是:在摄像机位置发射一条穿过当前鼠标位置的射线到达地面,获取射线到达地面的点然后让角色面向他
Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);//从Tag为MainCamera的摄像机位置开始发出一条经过鼠标点的射线
if (Physics.Raycast(camRay,out floorHit, camRaylength, floorMask))//当射线与floorMask碰撞器交叉时为真,否则为假。
{               //射线 输出碰撞点的信息 射线的长度 只选定Layermask层内的碰撞器,其它层内碰撞器忽略

    playerToMouse = floorHit.point - transform.position;//碰撞点与角色间的向量
    playerToMouse.y = 0f;
    newRotation = Quaternion.LookRotation(playerToMouse);//创建一个使z轴朝向playerToMouse对象的旋转,y轴约束
    playerRigidbody.MoveRotation(newRotation);//旋转该rigidbody到newRatation这个四元数角度
}






摄像机跟随
让摄像机保存与对象一定的距离然后控制其xz轴坐标,其中使用差值运算Lerp达到惯性效果
Transform offset = transform.position - target.position;//摄像机与目标的距离
Vector3 targetCamPos = target.position + offset;//设置摄像机位置
transform.position = Vector3.Lerp(transform.position, targetCamPos, smoothing * Time.deltaTime);//平滑移动,产生一个位置A到位置B的平滑移动效果
                                           //开始             结束              平滑值(0-1,数值越大延时移动越小)
角色被攻击时屏幕红色一闪而过也是这个Lerp控制






角色射击
使用Input.GetButtonDown("Fire1")获取鼠标点击、timer += Time.deltaTime来计时控制攻击间隔,每次开火前都清零
与角色旋转差不多,在角色枪口位置发射一条进过鼠标位置的射线,并检测射线触碰的对象,使用返回的选项来进行判断是否攻击到敌人:
ray = Physics.Raycast(shootRay, out shootHit, range, shootableMask);// 如果射线碰到了对象,并且对象的Layer为shootableMask,时返回真
如果ray返回为true那么就对收到攻击的敌人的HP进行操作,shootHit里保存有射线碰到敌人的信息
子弹射击效果可以用LineRenderer来实现,为角色对象添加LineRenderer组件后,设置其线条的顶点位置,可以做出光线的效果,
gunLineRenderer.SetPosition(0, transform.position);//在线条上设置线条的顶点位置,0表示第几个点
gunLineRenderer.SetPosition(1, transform.position + transform.forward*range);//设置光线的下一个点的位置(角色方向,距离range的点)
设置点0与点1产生了光线,子弹射击效果






动画控制
角色移动或死亡时模型会播放相应的动画
模型文件里已经做好了动画,如Player利旧包含有Death、Idle、Move这三个动画,他们分别代表着模型文件动画的多少帧之间为一个动画
将这些动画拖拽到Animator视图,动画之间make transition相连可以用Parameters中自己定义的变量来控制播放
比如Idle与Move,设置Idle为默认状态后,点击Idle链接向Move的连线(注意箭头方向,被指向的是后者),在Conditions里设置由Idle到Move动画播放的触发条件是IsWalking(自己定义的Bool值)的为true时播放,同理Move链接向Idle的条件设置为IsWalking的值为false。(如需多个conditions控制一个方向的动画时请多次将动画相连,这样会产生多个transition,旋转不同的transition设置条件即可)
后由角色移动脚本控制IsWakling的值就可以实现动画的播放
如PlayerMovenent脚本里的一段:
anim = GetComponent<Animator>();//获取角色对象身上的Animator控件,以控制动画播放
...

bool walking = h != 0f || v != 0f;//检查按键输入,当没有任何移动时为false
anim.SetBool("IsWalking", walking);//设置IsWalking变量的值,当为true时会播放move动画,以此类推
(Has Exit Time打钩时该动画的全部帧播放完才会跳转动画)
角色死亡动画可以用在Parameters创建的Trigger来触发,比如让Any State连接到Death动画,设置连接线为条件为新创建的Die(Trigger)参数
当角色死亡时
anim.SetTrigger ("Die");




----------------------------------------------------------


这里注意到EnemyHealth脚本里有一个public void StartSinking函数一直没有在脚本里调用,但是在游戏里却有地方在使用....

我们在EnemyAC动画的Death动画里的的Events里的时间线上的一个帧里看到了调用.........当动画播放到这个帧时..自动调用所选函数



  
0 0