My First RPG Game总结一_第1页
My First RPG Game总结一_第2页
My First RPG Game总结一_第3页
My First RPG Game总结一_第4页
My First RPG Game总结一_第5页
已阅读5页,还剩6页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、My First RPG Game总结一一进游戏把鼠标指针切换成想要的形状:File-Build settings,最下面有个player setting,在右侧属性中有个Default Cursor,拖动图片到那里即可镜头很远观看物体时有雾的效果:edit-render setting,勾选fog,调整浓度场景切换白色渐变效果做法:在NGUI中创建一个simple texture,Texture选择纯白色,选中它,右键tween-alpha,from为1,to为0由于进入游戏需要一段时间,Start Delay设为1秒过一会要显示游戏名字,我们把标题的alpha先设为0,添加alpha的tw

2、een,让它一会显示出来,ping pong播放给按任意键开始游戏这个按钮添加脚本html view plain copy 在CODE上查看代码片派生到我的代码片public class PressAnyKey : MonoBehaviour /按任意键开始是否按下 private bool start = false; private GameObject button; private void Start() button = transform.parent.Find(ButtonContainer).gameObject; void Update () if (start=false

3、) if (Input.anyKey) showButton(); /显示新游戏和载入游戏 private void showButton() button.SetActive(true); this.gameObject.SetActive(false); start = true; 这里注意的是html view plain copy 在CODE上查看代码片派生到我的代码片transform.parent.Find(ButtonContainer).gameObject; 拿到按钮的Gameobject要注意层级关系transform.parent.find犯的错误; public Gam

4、eObject characterPrefabs;将prefab中的Gameobject拖动到里面,那么请问还需要在代码中添加这段代码吗characterPrefabs=new GameObjectcharacterPrefabs.length;答:不能再添加这句话,否则报空指针如果在最上面 private GameObject characterObjects;那么还需要new来初始化吗?答,需要按钮按下调用脚本注意要把调用的方法设成public才能调用在写脚步时候遇到的问题csharp view plain copy 在CODE上查看代码片派生到我的代码片public GameObject

5、 characterPrefabs; private int nowIndex = 0; private GameObject characterObjects; private void Start() int length = characterPrefabs.Length; characterObjects = new GameObjectlength; for (int i= 0; iProjectSetting-time 找到Fixedtimestep。就可以修改了。Update和LateUpdate的区别在圣典里LateUpdate被解释成一句话:LateUpdate是在所有Upd

6、ate函数调用后被调用。 LateUpdate是晚于所有Update执行的。例如:游戏中有2个脚步,脚步1含有Update和LateUpdate,脚步2含有Update,那么当游戏执行时,每一帧都是把2个脚步中的Update执行完后才执行LateUpdate 。虽然是在同一帧中执行的,但是Update会先执行,LateUpdate会晚执行。 现在假设有2个不同的脚本同时在Update中控制一个物体,那么当其中一个脚本改变物体方位、旋转或者其他参数时,另一个脚步也在改变这些东西,那么这个物体的方位、旋转就会出现一定的反复。如果还有个物体在Update中跟随这个物体移动、旋转的话,那跟随的物体就会

7、出现抖动。 如果是在LateUpdate中跟随的话就会只跟随所有Update执行完后的最后位置、旋转,这样就防止了抖动。做一个相机跟随主角的功能时,相机的位置调整写在LateUpdate()对于人物的动画播放我们可以通过动画机,当然也可以直接用代码来实现动画播放,把动画拖动到player的animation中在人物行走的代码如下:csharp view plain copy 在CODE上查看代码片派生到我的代码片public enum AnimState run, idle public class PlayerDir : MonoBehaviour /鼠标左键单击的特效 public Gam

8、eObject effect_click_prefab; /是否面向鼠标点击的位置 private bool isLookAt=false; /这个目标坐标是在另一个PlayerMove调用的坐标 public Vector3 TargetPos; private CharacterController cc; public float speed = 4; /设置人物的动画状态 public AnimState playerAnimationState = AnimState.idle; private void Start() cc = GetComponent(); /让角色一进游戏的目

9、标位置为当前位置不发生移动 TargetPos = transform.position; void Update () if (Input.GetMouseButtonDown(0) Ray ray= Camera.main.ScreenPointToRay(Input.mousePosition); /用一个bool来看有没有射线碰撞,如果有,而且碰撞到地面的话就显示鼠标左键的特效 RaycastHit hitInfo; bool isCollider = Physics.Raycast(ray,out hitInfo); if(isCollider&hitInfo.collider.ta

10、g=Tags.ground) ShowClickEffect(hitInfo.point); isLookAt = true; else if (Input.GetMouseButtonUp(0) isLookAt = false; if (isLookAt) CharacterLookAtClick(); else Move(); /猪脚面向鼠标 void CharacterLookAtClick() /这里有个非常值得注意的地方,为什么不直接把上面的hitInfo传过来拿到目标点而是还要在函数里再做射线, /因为GetMouseButtonDown只要按下只返回一次,如果按住鼠标需要通过I

11、nput.GetMouseButton来实时返回结果 /所以鼠标一直按住isLookAt还是true,那么在这个函数再做一次射线检测才行 RaycastHit hitInfo; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); bool isCollider = P.Raycast(ray, out hitInfo); if (isCollider & hitInfo.collider.tag = Tags.ground) transform.LookAt(hitInfo.point); TargetPos = hitIn

12、fo.point; /如果鼠标点了一下,就实例化一个单击的特效 void ShowClickEffect(Vector3 hitPoint) Instantiate(effect_click_prefab,hitPoint,Quaternion.identity); /角色移动 void Move() /这里注意的是如果我直接 if (Vector3.Distance(TargetPos,transform.position)0.1)那么鼠标点击的y轴坐标和 /人物的y轴坐标是有距离的即使走到了该点距离仍然0.1所以要让TargetPos的y取人物的y坐标 Vector3 v = new Ve

13、ctor3(TargetPos.x,transform.position.y,TargetPos.z); if (Vector3.Distance(v,transform.position)0.1) csharp view plain copy 在CODE上查看代码片派生到我的代码片transform.LookAt(v);/这句话必须得加上,因为如果不加意思是鼠标抬起,朝着目标点行走,按理说没有错,但是如果遇到高地或者石头让人物行走的角度 csharp view plain copy 在CODE上查看代码片派生到我的代码片偏了一点那么会出现走到目标点仍然会行走的bug,所以要实时更新lookA

14、t角度 csharp view plain copy 在CODE上查看代码片派生到我的代码片 cc.SimpleMove(speed*transform.forward); playerAnimationState = AnimState.run; else playerAnimationState = AnimState.idle; 动画的代码如下:csharp view plain copy 在CODE上查看代码片派生到我的代码片public class PlayerAnim : MonoBehaviour private Animation anim; private PlayerDir

15、 dir; private void Start() anim = GetComponent(); /这里注意的是必须要拿到该脚本的组件,如果只是声明 private PlayerDir dir,直接调用dir.playerAnimationState /那么会报空指针 dir = GetComponent(); private void LateUpdate() /这里注意的是public enum AnimState要放到public class PlayerDir : MonoBehaviour的上面 /这样在这个脚本中调用上个脚本就直接拿到AnimState /还要注意在public

16、enum AnimState命名的时候会突然报错,可能是AnimState会与插件的类名重合了 if (dir.playerAnimationState= AnimState.idle) anim.CrossFade(Idle); else if(AnimState.run = dir.playerAnimationState) anim.CrossFade(Run); 下面添加相机跟随人物行走脚本csharp view plain copy 在CODE上查看代码片派生到我的代码片 private Transform player; private Vector3 offsetPostion;

17、 void Start () player = GameObject.FindGameObjectWithTag(Tags.player).transform; offsetPostion = transform.position - player.position; /这里注意要让相机的位置等于人物Position+offsetPosition,那么相机的更新位置要放到LateUpdate中防止抖动 /如果放到update中,那么会感觉一卡一卡的 private void LateUpdate() transform.position = player.position + offsetPo

18、stion; void Update () 对于鼠标滚轮的修改,Edit-Project settings-input鼠标向前滑动input.GetAxis(Mouse ScrollWheel)为正值所以这样来在相机的脚本中这样做csharp view plain copy 在CODE上查看代码片派生到我的代码片/调整鼠标滚轮的视野拉近 void ScollView() /视野的拉近改变的是相机镜头的距离角色的距离,而且这个距离是相机对角色的角度不变也即单位向量不变,改变长度 distance = offsetPostion.magnitude; distance -= scrollSpeed * Input.GetAxis(Mouse ScrollWheel); / offsetPostion.magnitude = distance;如果这样不行,向量的长度是只读的不能赋值,要用它的单位向量乘以距离 offsetPostion = offsetPostion.normalized * distance; 对于视野的左右旋转选用该函数,第一个参数是围绕哪个点旋转,第二个参数,围绕该点哪个轴旋转csharp view plain copy 在CODE上查

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论