【Unity3D实战】RPG黑暗之光Scene3:创建游戏运行场景及角色控制

【Unity3D实战】RPG黑暗之光Scene3:创建游戏运行场景及角色控制


1、创建场景:
基于上一个场景做一份拷贝,删除UI Root下的所有组件(除Camera外)。删除CharacterCreation物体。

2、标签管理:
创建脚本Tags.cs管理全局的标签。比如:
public const string ground = "Ground"; //const 标明这个是一个共有的不可变的变量
public const string player = "Player"; //玩家角色

3、实现鼠标点击地面的效果:
创建一个脚本PlayerDir.cs,附着到Player上。
从鼠标在屏幕的位置发射一条射线,由于地形是带有一个terrain collider的,所以可以和射线产生碰撞。并且Tag为Ground,那么就可以判断鼠标是点击到了地形上。
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
bool isCollider = Physics.Raycast(ray, out hitInfo);
当鼠标点击到了地面上,就实例化出来点击的效果。
public Vector3 targetPosition = Vector3.zero;
ShowClickEffect(hitInfo.point);
void ShowClickEffect( Vector3 hitPoint ) {
    hitPoint = new Vector3( hitPoint.x,hitPoint.y + 0.1f ,hitPoint.z );
    GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity);
}

4、控制主角的朝向(鼠标点击地面的时候转向):
同样是在PlayerDir.cs脚本里面:
void LookAtTarget(Vector3 hitPoint) { //让主角朝向目标位置
    targetPosition = hitPoint;
    targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z);
    this.transform.LookAt(targetPosition);
}

5、控制主角的移动:
角色添加一个Character Controller。创建行走脚本PlayerMove.cs。由于在PlayerDir.cs里面已经定义了Player朝向,所以PlayerMove.cs只需要向前走就可以了。
private CharacterController controller;
ontroller = this.GetComponent<CharacterController>();
controller.SimpleMove(transform.forward * speed);

6、控制主角的跳跃:
模拟重力系统:
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
private Vector3 moveDirection = Vector3.zero;
void Update()
{
    CharacterController controller = GetComponent<CharacterController>();
    if (controller.isGrounded)//判断角色是否落地
    {
        if (Input.GetKey(KeyCode.Space))//或者if (Input.GetButton("Jump"))
            moveDirection.y = jumpSpeed;


    }
    moveDirection.y -= gravity * Time.deltaTime;
    controller.Move(moveDirection * Time.deltaTime);
}

7、控制主角的移动动画:
添加Animation组件,并把所有动画添加上去。(新的mecanim动画系统允许添加Animator组件,并通过动画状态机控制)
animation.CrossFade(“Run”);//老系统
animation.Play(“Run”);//老系统
animator.SetBool("Dead", true);//新系统
animator.SetTrigger("Walk");//新系统

8、控制相机跟随主角的移动:
给相机添加一个FllowPlayer.cs的脚本
private Transform player;
private Vector3 offsetPosition;//位置偏移
void Start () {
    player = GameObject.FindGameObjectWithTag(Tags.player).transform;
    transform.LookAt(player.position);
    offsetPosition = transform.position - player.position;
}
void Update () {
    transform.position = offsetPosition + player.position;//根据偏移来移动相机
}

9、使用鼠标滑动控制相机视野的拉近和拉远:
同样编辑FllowPlayer.cs脚本
public float distance = 0;
public float scrollSpeed = 10;
void Update () {
    //处理视野的拉近和拉远效果
    ScrollView();
}
void ScrollView() {
    //print(Input.GetAxis("Mouse ScrollWheel"));//向后 返回负值 (拉近视野) 向前滑动 返回正值(拉远视野)
    distance = offsetPosition.magnitude;//返回向量的长度,即距离
    distance += Input.GetAxis("Mouse ScrollWheel")*scrollSpeed;
    distance = Mathf.Clamp(distance, 2, 18);//限制distance值在2-18之间
    offsetPosition = offsetPosition.normalized * distance;//单位向量 * 距离
}

10、控制视野的左右旋转(鼠标右键按住左右拉):
同样编辑FllowPlayer.cs脚本
public float rotateSpeed = 2;
private bool isRotating = false;
void Update () {
    //处理视野的拉近和拉远效果
    RotateView();
}
void RotateView() {
    //Input.GetAxis("Mouse X");//得到鼠标在水平方向的滑动
    //Input.GetAxis("Mouse Y");//得到鼠标在垂直方向的滑动
    if (Input.GetMouseButtonDown(1)) {
        isRotating = true;
    }
    if (Input.GetMouseButtonUp(1)) {
        isRotating = false;
    }
    if (isRotating) {
        transform.RotateAround(player.position, player.up, rotateSpeed * Input.GetAxis("Mouse X"));//围绕Player这个点,Player的Y轴旋转
    }
    offsetPosition = transform.position - player.position;
}

11、控制视野的上下旋转和范围(鼠标右键按住上下拉):
同样编辑FllowPlayer.cs脚本
void RotateView() {
    //Input.GetAxis("Mouse X");//得到鼠标在水平方向的滑动
    //Input.GetAxis("Mouse Y");//得到鼠标在垂直方向的滑动
    if (Input.GetMouseButtonDown(1)) {
        isRotating = true;
    }
    if (Input.GetMouseButtonUp(1)) {
        isRotating = false;
    }
    if (isRotating) {
        Vector3 originalPos = transform.position;
        Quaternion originalRotation = transform.rotation;


        transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));//影响的属性有两个 一个是position 一个是rotation
        float x = transform.eulerAngles.x;
        if (x < 10 || x > 80) {//当超出范围之后,我们将属性归位原来的,就是让旋转无效 
            transform.position = originalPos;
            transform.rotation = originalRotation;
        }
    }
    offsetPosition = transform.position - player.position;
}

12、给角色添加状态信息:
血量,蓝,攻击等等,新建一个脚本PlayerStatus.cs。这部分没有特别需要注意的,不细述。
public int level = 1; // 100+level*30
public string name = "默认名称";
public int hp = 100;//hp最大值
public int mp = 100;//mp最大值
public float hp_remain = 100;
public float mp_remain = 100;
public float exp = 0;//当前已经获得的经验
public float attack = 20;
public int attack_plus = 0;
public float def = 20;
public int def_plus = 0;
public float speed = 20;
public int speed_plus = 0;
public int point_remain = 0;//剩余的点数

posted on 2016-05-31 00:29  nobcaup  阅读(317)  评论(0编辑  收藏  举报

导航