1/28 小作品


    private Vector3 movement;
    public float runSpeed = 6;
    public float jumpForce = 25f;

    private void Update()
    {
        float h = Input.GetAxis("Horizontal");      
        Move(h);
        movement.y += cc.isGrounded ? 0f : Physics.gravity.y * 10f * Time.deltaTime;
        anim.SetFloat("forward", cc.velocity.magnitude);
        anim.SetBool("grounded", cc.isGrounded);
        print(cc.velocity.magnitude);
        if (h!=0)
        {
            Vector3 direct = Vector3.right * h;
            MyRotate(direct, 10);
           
        }
        if(Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
        if(Input.GetKeyDown(KeyCode.G))
        {
            GrabCheck();
        }
    }

    public void Move(float h)
    {
        //movement = new Vector3(h * runSpeed * Time.deltaTime, cc.velocity.y, 0);
        //cc.Move(movement);
       movement.x = h * runSpeed;
       movement.z = 0;
       cc.Move(movement * Time.deltaTime);
    }

    public void Jump()
    {
        if (cc.isGrounded)
        {
            movement.y = jumpForce;
        }
    }
 



    public void GrabCheck()
    {

    }
protected CharacterController cc;
    protected Animator anim;
    protected bool rotateComplete = true;
    

    private void Awake()
    {
        anim = GetComponentInChildren<Animator>();
        cc = GetComponent<CharacterController>();
    }


   
    public void MyRotate(Vector3 lookDirec, float trunSpeed)
    {
        rotateComplete = false;
    }

    public void Death()
    {

    }

    public void TakeDamage(Character inflicter,int damage)
    {

    }

    public void Attack()
    {

    }
if (h != 0)//巧妙的控制转向问题,3D 横版的转向。
        {
            Vector3 direct = Vector3.right * h;
            MyRotate(direct, 10);//可控制旋转,正90,-90

        }
public void MyRotate(Vector3 lookDirec, float trunSpeed)
    {
        rotateComplete = false;
        Vector3 targetPos = transform.position + lookDirec;
        Vector3 characterPos = transform.position;

        //去除Y轴影响 
        characterPos.y = 0;
        targetPos.y = 0;
        //角色面朝的目标向量
        Vector3 faceToDir = targetPos - characterPos;
        //角色面朝目标方向的四元数
        Quaternion faceToQuat = Quaternion.LookRotation(faceToDir);
        //球面插值
        Quaternion slerp = Quaternion.Slerp(transform.rotation, faceToQuat, trunSpeed * Time.deltaTime);
        if(slerp == faceToQuat)
        {
            rotateComplete = true;
        }
        transform.rotation = slerp;
    }

float dist = cc.height / 2;

//检测下方距离。
        RaycastHit hit;
        if (Physics.Raycast(transform.position, Vector3.down, out hit, dist + 0.05f))
        {
            if(hit.transform.GetComponent<Character>()&& hit.transform!=transform)
            {
                hit.transform.GetComponent<Character>().TakeDamage(this,damage);
            }
        }
//相机跟随 横版的,比较经典啦
public Transform target;

    public float distance = 8f;
    public float hight = -1f;

    private void LateUpdate()
    {
        if (!target) return;

        transform.position = target.position;

        transform.position -= Vector3.forward * distance;

        transform.position = new Vector3(transform.position.x, transform.position.y+hight, transform.position.z);
    }


//三个控制动画状态的脚本太巧妙啦。速度长度,是否落地,是否有物体。
anim.SetFloat("forward", cc.velocity.magnitude);
anim.SetBool("grounded", cc.isGrounded);
anim.SetBool("isgrab", grabObject ? true : false);

//characterContoler的移动脚本很经典了,符合物理规则
 public void Move(float h)
    {
        //movement = new Vector3(h * runSpeed * Time.deltaTime, cc.velocity.y, 0);
        //cc.Move(movement);
        movement.x = h * runSpeed;
        movement.y += cc.isGrounded ? 0f : Physics.gravity.y * 10f * Time.deltaTime;
        
        movement.z = 0;
        cc.Move(movement * Time.deltaTime);
    }

抓取脚本很强。
 public void GrabCheck()
    {
        if(grabObject != null && rotateComplete)
        {
            //有抓取物,并且转向完成
            grabObject.transform.SetParent(null);
            grabObject.GetComponent<Rigidbody>().isKinematic = false;
            grabObject = null;
        }
        else
        {
            float dist = cc.radius;
            RaycastHit hit;
            if (Physics.Raycast(transform.position, transform.forward, out hit, dist + 1))
            {
                if(hit.collider.CompareTag("GrabBox"))
                {
                    grabObject = hit.transform;
                    grabObject.SetParent(socketObject);
                    grabObject.localPosition = Vector3.zero;
                    grabObject.localRotation = Quaternion.identity;
                    grabObject.GetComponent<Rigidbody>().isKinematic = true;
                }
            }
        }

模拟敌人攻击很经典啦。
 void Update() {
        if (Time.time > lastCheckStateTime + 2)
        {
            lastCheckStateTime = Time.time;
            simulateInputX = Random.Range(-1, 1f);
            simulateJump = Random.Range(0, 2) == 1 ? true : false;
            
        }
        anim.SetFloat("forward", cc.velocity.magnitude);
        anim.SetBool("grounded", cc.isGrounded);
        MoveControl(simulateInputX);
        Jump(simulateJump);
        Attack();

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值