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

Posted nobcaup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;//剩余的点数

以上是关于Unity3D实战RPG黑暗之光Scene3:创建游戏运行场景及角色控制的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D实战RPG黑暗之光:游戏分解及各系统的实现

Unity初探之黑暗之光

unity初探之黑暗之光

如何在unity3d中将2d对象导入场景3d

UGUI之黑暗之光——UI的搭建

黑暗之光 Day3