自学Unity3D系列-Hoshi酱的森林大冒险?(第二天)

前言

打算做一个场景,把常用的游戏功能都加进来。名字就叫《Hoshi酱的森林大冒险吧》...取这名字是因为游戏人物模型就叫Hoshi

游戏采用2.5D固定视角,规划是在森林打怪,最后打boss这样。没有什么情节,就是为了练手。

由于后续都会在此项目添加功能,以后标题就不添加天数了。毕竟业余且断断续续在做,时间也不好统计。

今日内容及问题点

  • 新建项目:人物模型导入,地形资源导入、天空盒导入
  • 新建地形:用山围起来可活动区域、加点树、给山上个岩石纹理。加点花/草什么的,这是个大工程,这边先随便搞搞......

地图太大了,一般画边缘我用top视图,种树或者细节,把人拖到视角内,根据渲染窗口来画。

image

  • 人物动画
    导入模型时,可能因为模型是早期的,动画需要修改配置后才会生效。方法:项目列表选中动画,检查器切换到页签Rig,动画类型切换为旧版,点击应用。
    image

  • 人物动作
    新建脚本:HeroMove,编写代码。支持响应按键:WSAD:走路,QE:旋转视角,左Shift:切换走路/跑步 空格:跳跃。在做不同动作时,播放不同的动画。

HeroMove
using UnityEngine;

public class HeroMove : MonoBehaviour {
    public float WalkSpeed = 3f;//行走速度
    public float RunSpeed=9f;//奔跑速度
    public float RotateSpeed = 35f;//旋转速度
    private bool _isRun = false;//是否正在奔跑
    void Update() {
        var anim = GetComponent<Animation>();
        
        if (Input.GetKeyDown(KeyCode.Space)) {//跳跃
            GetComponent<Rigidbody>().velocity = Vector3.up * 3f;
            anim.Play("Jump");
        }
        else {
            bool isBack = false;//是否人物后退
            bool isMove = false;//人物是否移动

            if (Input.GetKey(KeyCode.W)) {//前进:根据是否奔跑切换不同速度
                if (Input.GetKeyDown(KeyCode.LeftShift)) _isRun = !_isRun;
                transform.Translate(Vector3.forward * Time.deltaTime * (_isRun ? RunSpeed : WalkSpeed));
                isMove = true;
            }
            else if (Input.GetKey(KeyCode.S)) {//后退:不允许奔跑
                transform.Translate(Vector3.back * Time.deltaTime * WalkSpeed);
                isBack = true;
                isMove = true;
                _isRun = false;
            }

            if (Input.GetKey(KeyCode.A)) {//向左
                transform.Translate(Vector3.left * Time.deltaTime * WalkSpeed);
                isMove = true;
            }
            else if (Input.GetKey(KeyCode.D)) {//向右
                transform.Translate(Vector3.right * Time.deltaTime * WalkSpeed);
                isMove = true;
            }

            if (Input.GetKey(KeyCode.E)) {//右转视角
                transform.Rotate(Vector3.up * Time.deltaTime * RotateSpeed);
            }
            else if (Input.GetKey(KeyCode.Q)) {//左转视角
                transform.Rotate(Vector3.down * Time.deltaTime * RotateSpeed);
            }

            if (isMove && _isRun) {//移动中且跑,播放奔跑动画
                anim.Play("Run");
            }
            else if (isMove) {//根据是否后退,播放走路或后退走路动画
                anim.Play(isBack ? "Walk_back" : "Walk");
            }
            else {//播放闲置动画
                anim.Play("Idle_A");
                _isRun = false;
            }
        }
    }
}

使用技术点

移动/旋转对象、按键检测、添加力、播放动画

经验总结

  • 天空盒子要挂载在摄像机上。

  • 2.5D原理:主摄像头添加到人物模型内。这样人物移动时,摄像头也会跟着移动。就是2.5D固定视角的效果。

  • 导入模型时要检测动画检查器信息是否有误,存在错误,动画不会生效的。

  • UI的Canvas画布渲染模式改为:屏幕空间-覆盖,层级拉到摄像机的子级。

现有问题点

  • 跳跃时,如果按着WSAD,则跳跃的动作被行走替换掉,就没有跳跃效果了。

  • 地形的树貌似没有碰撞体积,人可以直接穿过。

Demo

录个动图留个念想...
image

posted @ 2021-12-22 13:41  苏暖暖  阅读(145)  评论(0编辑  收藏  举报